Avatar billede mummikiks Nybegynder
05. februar 2006 - 23:26 Der er 56 kommentarer og
1 løsning

Applikation til ombytning af museknapper

Hej Experter

Jeg står overfor at skulle bruge en lille applikation til en touchscreen, hvor jeg gerne vil have et lille flytbart vindue,som man kan trykke på, hvorefter det næste tryk bliver et højre-klik. Det andet tryk skal igen være et venstre klik.

Er der nogen der har et forslag..?
Avatar billede bertelbrander Novice
05. februar 2006 - 23:36 #1
Det burde være let at instalere en hook og lave en lille windows applikation med en knap til formålet.
Kan du selv kode eller er du ude efter en færdig løsning?
Har du en C++ compiler? Hvilken?
Avatar billede bertelbrander Novice
05. februar 2006 - 23:59 #2
Dette ser ud til at virke:

#include <windows.h>

#define IDC_BUTTON1  1200
#define IDC_STATIC_1 1201

HINSTANCE InstanceHandle;
HWND WindowHandle;
HHOOK MouseHook;

enum
{
  IDLE, WAIT_DOWN, WAIT_UP
}State = IDLE;

void SendKey(bool aDown, LONG aX, LONG aY, DWORD aTime)
{
  INPUT Input;
  memset(&Input, 0, sizeof(Input));
  Input.type = INPUT_MOUSE;
  Input.mi.dx = aX;
  Input.mi.dy = aY;
  if(aDown)
      Input.mi.dwFlags = MOUSEEVENTF_RIGHTDOWN;
  else
      Input.mi.dwFlags = MOUSEEVENTF_RIGHTUP;
  Input.mi.time = aTime;

  SendInput(1, &Input, sizeof(INPUT));
}

LRESULT LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
  if(nCode == HC_ACTION)
  {
      if(wParam == WM_LBUTTONDOWN && State == WAIT_DOWN)
      {
        MSLLHOOKSTRUCT *MouseStruct = (MSLLHOOKSTRUCT *)lParam;
        if(!(MouseStruct->flags & LLMHF_INJECTED))
        {
            SendKey(true, MouseStruct->pt.x, MouseStruct->pt.y, MouseStruct->time);
            State = WAIT_UP;
            SetDlgItemText(WindowHandle, IDC_STATIC_1, "Wait up");
            return TRUE;
        }
      }
      else if(wParam == WM_LBUTTONUP && State == WAIT_UP)
      {
        MSLLHOOKSTRUCT *MouseStruct = (MSLLHOOKSTRUCT *)lParam;
        if(!(MouseStruct->flags & LLMHF_INJECTED))
        {
            SendKey(false, MouseStruct->pt.x, MouseStruct->pt.y, MouseStruct->time);
            State = IDLE;
            SetDlgItemText(WindowHandle, IDC_STATIC_1, "Idle");
            return TRUE;
        }
      }
  }

  return CallNextHookEx(MouseHook, nCode, wParam, lParam);
}

void InstallHook(HWND hwndDlg)
{
  if(MouseHook)
      return;

  MouseHook = SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC  )LowLevelMouseProc, GetModuleHandle(0), 0);
  if(!MouseHook)
  {
      MessageBox(hwndDlg, "Failed to install Hook", "PageDown Remover", MB_OK);
  }
}

void UnInstallHook(void)
{
  if(MouseHook)
      UnhookWindowsHookEx(MouseHook);
  MouseHook = 0;
}

LRESULT CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
  switch(msg)
  {
  case WM_CREATE:
      CreateWindow("STATIC",
                  "Idle", // Initial Text
                  WS_CHILD | WS_VISIBLE | SS_LEFT,  // Style
                  5, 5, 100, 20, // position
                  hwndDlg, // Owner
                  (HMENU)(IDC_STATIC_1), // ID
                  InstanceHandle,  // The application
                  0);

      CreateWindow("BUTTON",
                  "Push Me",                        // Button Text
                  WS_CHILD | WS_VISIBLE,  // Style
                  5, 30, 100, 30, // position
                  hwndDlg, // Owner
                  (HMENU)(IDC_BUTTON1), // ID
                  InstanceHandle,  // The application
                  0);
      InstallHook(hwndDlg);
      break;
  case WM_COMMAND:
      SetDlgItemText(hwndDlg, IDC_STATIC_1, "Waiting");
      State = WAIT_DOWN;
      break;
  }
  return DefWindowProc(hwndDlg, msg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, INT)
{
  InstanceHandle = hInstance;

  WNDCLASS wc;
  memset(&wc, 0, sizeof(WNDCLASS));
  wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
  wc.lpfnWndProc = DialogProc;
  wc.hInstance = InstanceHandle;
  wc.hbrBackground = (HBRUSH )(COLOR_BTNFACE + 1);
  wc.lpszClassName = "WhateverClass";
  wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  if(!RegisterClass(&wc))
      return FALSE;

  WindowHandle = CreateWindow("WhateverClass",
                              "Whatever", // Caption text
                              WS_MINIMIZEBOX | WS_VISIBLE | WS_CLIPSIBLINGS |
                              WS_CLIPCHILDREN | WS_MAXIMIZEBOX | WS_CAPTION | WS_BORDER | WS_SYSMENU,
                              100, 100, 150, 100,  // Position
                              NULL,
                              NULL,
                              InstanceHandle,
                              0);
  MSG Msg;
  while(GetMessage(&Msg, WindowHandle, 0, 0xFFFF) > 0)
  {
      if(!IsDialogMessage(WindowHandle, &Msg))
      {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
      }
  }

  UnInstallHook();
  return 0;
}
Avatar billede mummikiks Nybegynder
06. februar 2006 - 00:11 #3
Så for sivan bertel. Jeg har programmeret meget i java, men skal lige prøve det her også. Jeg står lidt overfor at skulle beslutte mig til hvilken compiler/IDe jeg skal bruge til at skrive kode med anvendelse af win api. Jeg har valget imellem Visual studio 2005 (Kan hente det fra Uni), dev c++ eller eclipse med plugin. Angående ovenstående kode, er det noget du lige har strikket sammen eller har fundet et sted?
Avatar billede mummikiks Nybegynder
06. februar 2006 - 00:12 #4
Men da imponeret over det hurtige svar ...Waauv
Avatar billede bertelbrander Novice
06. februar 2006 - 00:15 #5
Det er et par "samples" fra min hjemmeside der er blevet sat sammen.

Med hensyn til IDE/compiler: Download dev-cpp (med mingw compiler) det er det letteste.
Hvis du vælger VisualC++ skal du også downloade "platform sdk", som alene er 300MByte.
Jeg har ikke brugt eclipse.
Avatar billede mummikiks Nybegynder
06. februar 2006 - 00:43 #6
Hej Bertel... Nu er jeg ny på området, men kan egentlig godt følge tankegangen med apiet.
Jeg får dog følgende fejl ved kompilering af min fil mouse.cpp

In function `void SendKey(bool, LONG, LONG, DWORD)':
17 `INPUT' undeclared (first use this function)
  (Each undeclared identifier is reported only once for each function it appears in.)
17 expected `;' before "Input"
18 `Input' undeclared (first use this function)

19 `INPUT_MOUSE' undeclared (first use this function)
28 `SendInput' undeclared (first use this function)
    In function `LRESULT LowLevelMouseProc(int, WPARAM, LPARAM)':
38 `LLMHF_INJECTED' undeclared (first use this function)
Avatar billede bertelbrander Novice
06. februar 2006 - 00:47 #7
Put disse to linier ind som det første i filen (dvs inden #include <windows.h>):

#define _WIN32_WINNT 0x0500
#define LLMHF_INJECTED 1

Så kan selv gcc oversætte.
Avatar billede mummikiks Nybegynder
06. februar 2006 - 01:26 #8
Det kører nu, men har et problem med at kommandoprompten vises i baggrunden. Har bestilt win api bogen, men indtil den kommer har du så et tip til at fjerne den? Ellers kan du bare smide et svar..Jeg siger tak for hjælpen
Avatar billede bertelbrander Novice
06. februar 2006 - 01:36 #9
Du skal fortælle compileren at du vil lave en windows aspp og ikke en console app.
I nogle versioner af dev-cpp kan du gøre det under:
Options -> Compiler Options -> Linker -> "Compile for Win32 (no console)"
Det er kommandolinien option -mwindows der skal sættes.

Husk at lukke http://www.eksperten.dk/spm/685470 evt. med en henvisning hertil.

Jeg samler ikke på point.
Avatar billede mummikiks Nybegynder
06. februar 2006 - 19:34 #10
Hej Bertel.. Vil du bare have at jeg selv ligger et svar?
Avatar billede mummikiks Nybegynder
06. februar 2006 - 19:37 #11
Nu er jeg igennem de første 50 sider i tutorialen fra winprog, men har et spørgsmål. Jeg ønsker at lave applikationen således at jeg laver to billeder, hvori der stå v og h, som venstre og højre. Jeg har så planer om at markere henholdsvis venstre og højre med en farve på de to forskellige billeder. Jeg vil så blot skifte billedet når man trykke, altså i stedet for at skrive idle!
Avatar billede bertelbrander Novice
06. februar 2006 - 20:04 #12
Ja, du må gerne lave et svar og acceptere det.

Jeg forstår ikke rigtigt det andet spørgsmål.
Avatar billede mummikiks Nybegynder
06. februar 2006 - 20:23 #13
Beklager min vage formulering. Prøver lige igen. Jeg ønsker at lave vinduet således at man kan se hvilken museknap der er trykket ned. Jeg havde forestillet mig at lave to forskellige billeder.
Disse kan findes på http://www.control.aau.dk/~05gr551/

Når man trykker skal billeder skfifte til højre. Hvordan gøres dette i C? i java ville man jo bare venstre.visible = false;

kan du give et lille eksempel på hvordan man indsætter et billede og skifter det?
Avatar billede bertelbrander Novice
06. februar 2006 - 20:48 #14
Start med at lave dine png billeder om til bmp, windows er ikke så god til .png.

Så lave du to globale variable til at holde et håndtag til dine billeder:
HANDLE LeftImage, HoejreImage;

I starten af main kan du så læse dine .bmp billeder:
  HoejreImage = LoadImage(0, "hoejre.bmp", IMAGE_BITMAP, 150, 100, LR_LOADFROMFILE);
  LeftImage = LoadImage(0, "left.bmp", IMAGE_BITMAP, 150, 100, LR_LOADFROMFILE);

Når du opretter knappen skal du fortælle windows at knappen skal være med bitmap:
      CreateWindow("BUTTON",
                  "Push Me",                       
                  WS_CHILD | WS_VISIBLE | BS_BITMAP,
                  5, 5, 160, 110,
                  hwndDlg,
                  (HMENU)(IDC_BUTTON1),
                  InstanceHandle, 
                  0);
Samtidig justeres størrelsen så den passer på knappen.

Så kan du skifte billede med:
  SendDlgItemMessage(WindowHandle, IDC_BUTTON1, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM )LeftImage);
Avatar billede mummikiks Nybegynder
06. februar 2006 - 21:23 #15
Jeg har lavet følgende:

<code>
#define _WIN32_WINNT 0x0500
#define LLMHF_INJECTED 1
#include <windows.h>


#define IDC_BUTTON1  1200
#define IDC_STATIC_1 1201

HINSTANCE InstanceHandle;
HWND WindowHandle;
HHOOK MouseHook;
HANDLE LeftImage, HoejreImage;

enum
{
  IDLE, WAIT_DOWN, WAIT_UP
}State = IDLE;

void SendKey(bool aDown, LONG aX, LONG aY, DWORD aTime)
{
  INPUT Input;
  memset(&Input, 0, sizeof(Input));
  Input.type = INPUT_MOUSE;
  Input.mi.dx = aX;
  Input.mi.dy = aY;
  if(aDown)
      Input.mi.dwFlags = MOUSEEVENTF_RIGHTDOWN;
  else
      Input.mi.dwFlags = MOUSEEVENTF_RIGHTUP;
  Input.mi.time = aTime;

  SendInput(1, &Input, sizeof(INPUT));
}

LRESULT LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
  if(nCode == HC_ACTION)
  {
      if(wParam == WM_LBUTTONDOWN && State == WAIT_DOWN)
      {
        MSLLHOOKSTRUCT *MouseStruct = (MSLLHOOKSTRUCT *)lParam;
        if(!(MouseStruct->flags & LLMHF_INJECTED))
        {
            SendDlgItemMessage(WindowHandle, IDC_BUTTON1, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM )HoejreImage);
            State = WAIT_UP;
            SendKey(true, MouseStruct->pt.x, MouseStruct->pt.y, MouseStruct->time);
            //SetDlgItemText(WindowHandle, IDC_STATIC_1, "Wait up");
            return TRUE;
        }
      }
      else if(wParam == WM_LBUTTONUP && State == WAIT_UP)
      {
        MSLLHOOKSTRUCT *MouseStruct = (MSLLHOOKSTRUCT *)lParam;
        if(!(MouseStruct->flags & LLMHF_INJECTED))
        {
            SendDlgItemMessage(WindowHandle, IDC_BUTTON1, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM )LeftImage);
            State = IDLE;
            SendKey(false, MouseStruct->pt.x, MouseStruct->pt.y, MouseStruct->time);
            //SetDlgItemText(WindowHandle, IDC_STATIC_1, "Idle");
            return TRUE;
        }
      }
  }

  return CallNextHookEx(MouseHook, nCode, wParam, lParam);
}

void InstallHook(HWND hwndDlg)
{
  if(MouseHook)
      return;

  MouseHook = SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC  )LowLevelMouseProc, GetModuleHandle(0), 0);
  if(!MouseHook)
  {
      MessageBox(hwndDlg, "Failed to install Hook", "PageDown Remover", MB_OK);
  }
}

void UnInstallHook(void)
{
  if(MouseHook)
      UnhookWindowsHookEx(MouseHook);
  MouseHook = 0;
}

LRESULT CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
  switch(msg)
  {
  case WM_CREATE:
      CreateWindow("STATIC",
                  "Idle", // Initial Text
                  WS_CHILD | WS_VISIBLE | SS_LEFT,  // Style
                  5, 5, 100, 20, // position
                  hwndDlg, // Owner
                  (HMENU)(IDC_STATIC_1), // ID
                  InstanceHandle,  // The application
                  0);

      CreateWindow("BUTTON",
                  "Push Me",                       
                  WS_CHILD | WS_VISIBLE | BS_BITMAP,
                  5, 5, 160, 110,
                  hwndDlg,
                  (HMENU)(IDC_BUTTON1),
                  InstanceHandle, 
                  0);           
                 
      InstallHook(hwndDlg);
      break;
     
  case WM_COMMAND:
      SendDlgItemMessage(WindowHandle, IDC_BUTTON1, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM )HoejreImage);
      //SetDlgItemText(hwndDlg, IDC_STATIC_1, "Waiting");
      State = WAIT_DOWN;
      break;
  }
  return DefWindowProc(hwndDlg, msg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, INT)
{
  InstanceHandle = hInstance;
  HoejreImage = LoadImage(0, "hoejre.bmp", IMAGE_BITMAP, 150, 100, LR_LOADFROMFILE);
  LeftImage = LoadImage(0, "left.bmp", IMAGE_BITMAP, 150, 100, LR_LOADFROMFILE);



  WNDCLASS wc;
  memset(&wc, 0, sizeof(WNDCLASS));
  wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
  wc.lpfnWndProc = DialogProc;
  wc.hInstance = InstanceHandle;
  wc.hbrBackground = (HBRUSH )(COLOR_BTNFACE + 1);
  wc.lpszClassName = "WhateverClass";
  wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  if(!RegisterClass(&wc))
      return FALSE;

  WindowHandle = CreateWindow("WhateverClass",
                              "Switch Mousebuttons", // Caption text
                              WS_VISIBLE | WS_CLIPSIBLINGS |
                              WS_CLIPCHILDREN | WS_CAPTION | WS_BORDER | WS_SYSMENU,
                              100, 100, 150, 100,  // Position
                              NULL,
                              NULL,
                              InstanceHandle,
                              0);
  SendDlgItemMessage(WindowHandle, IDC_BUTTON1, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM )LeftImage);
  MSG Msg;
  while(GetMessage(&Msg, WindowHandle, 0, 0xFFFF) > 0)
  {
      if(!IsDialogMessage(WindowHandle, &Msg))
      {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
      }
  }

  UnInstallHook();
  return 0;
}
</code

Jeg ønsker så at fjerne knapeffekten samt at køre den helt ud til hjørnerne. Hvor finder jeg attributerne til knappen?
Avatar billede bertelbrander Novice
06. februar 2006 - 21:59 #16
Hvis ikke det skal virke som en knap vil jeg foreslå at du laver det om til en static, dvs opretter den på samme måde som IDC_STATIC_1, men give den SS_ICON style.

Så kan du sætte bitmap med STM_SETIMAGE

Du skal så fange WM_LBUTTONDOWN i DialogProc og sætte state og skifte billede der.
Avatar billede mummikiks Nybegynder
06. februar 2006 - 22:47 #17
Har lavet følgende kode:

#define _WIN32_WINNT 0x0500
#define LLMHF_INJECTED 1
#include <windows.h>


#define IDC_BUTTON1  1200
#define IDC_STATIC_1 1201

HINSTANCE InstanceHandle;
HWND WindowHandle;
HHOOK MouseHook;
HANDLE LeftImage, HoejreImage;

enum
{
  IDLE, WAIT_DOWN, WAIT_UP
}State = IDLE;

void SendKey(bool aDown, LONG aX, LONG aY, DWORD aTime)
{
  INPUT Input;
  memset(&Input, 0, sizeof(Input));
  Input.type = INPUT_MOUSE;
  Input.mi.dx = aX;
  Input.mi.dy = aY;
  if(aDown)
      Input.mi.dwFlags = MOUSEEVENTF_RIGHTDOWN;
  else
      Input.mi.dwFlags = MOUSEEVENTF_RIGHTUP;
  Input.mi.time = aTime;

  SendInput(1, &Input, sizeof(INPUT));
}

LRESULT LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
  if(nCode == HC_ACTION)
  {
      if(wParam == WM_LBUTTONDOWN && State == WAIT_DOWN)
      {
        MSLLHOOKSTRUCT *MouseStruct = (MSLLHOOKSTRUCT *)lParam;
        if(!(MouseStruct->flags & LLMHF_INJECTED))
        {
          SendDlgItemMessage(WindowHandle, IDC_BUTTON1, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM )HoejreImage);
            State = WAIT_UP;
            SendKey(true, MouseStruct->pt.x, MouseStruct->pt.y, MouseStruct->time);
            //SetDlgItemText(WindowHandle, IDC_STATIC_1, "Wait up");
            return TRUE;
        }
      }
      else if(wParam == WM_LBUTTONUP && State == WAIT_UP)
      {
        MSLLHOOKSTRUCT *MouseStruct = (MSLLHOOKSTRUCT *)lParam;
        if(!(MouseStruct->flags & LLMHF_INJECTED))
        {
            SendDlgItemMessage(WindowHandle, IDC_BUTTON1, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM )LeftImage);
            State = IDLE;
            SendKey(false, MouseStruct->pt.x, MouseStruct->pt.y, MouseStruct->time);
            //SetDlgItemText(WindowHandle, IDC_STATIC_1, "Idle");
            return TRUE;
        }
      }
  }

  return CallNextHookEx(MouseHook, nCode, wParam, lParam);
}

void InstallHook(HWND hwndDlg)
{
  if(MouseHook)
      return;

  MouseHook = SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC  )LowLevelMouseProc, GetModuleHandle(0), 0);
  if(!MouseHook)
  {
      MessageBox(hwndDlg, "Failed to install Hook", "PageDown Remover", MB_OK);
  }
}

void UnInstallHook(void)
{
  if(MouseHook)
      UnhookWindowsHookEx(MouseHook);
  MouseHook = 0;
}

LRESULT CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
  switch(msg)
  {
  case WM_CREATE:
      CreateWindow("STATIC",
                  "Idle", // Initial Text
                  WS_CHILD | WS_VISIBLE | SS_LEFT,  // Style
                  5, 5, 100, 20, // position
                  hwndDlg, // Owner
                  (HMENU)(IDC_STATIC_1), // ID
                  InstanceHandle,  // The application
                  0);

      CreateWindow("STATIC",
                  "Push Me",                       
                  WS_CHILD | WS_VISIBLE | BS_BITMAP,
                  5, 5, 160, 110,
                  hwndDlg,
                  (HMENU)(IDC_BUTTON1),
                  InstanceHandle, 
                  0);           
                 
      InstallHook(hwndDlg);
      break;
     
  case WM_LBUTTONDOWN:
      SendDlgItemMessage(WindowHandle, IDC_BUTTON1, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM )HoejreImage);
      break;
         
  case WM_COMMAND:
      SendDlgItemMessage(WindowHandle, IDC_BUTTON1, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM )HoejreImage);
      //SetDlgItemText(hwndDlg, IDC_STATIC_1, "Waiting");
      State = WAIT_DOWN;
      break;
  }
  return DefWindowProc(hwndDlg, msg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, INT)
{
  InstanceHandle = hInstance;
  HoejreImage = LoadImage(0, "hoejre.bmp", IMAGE_BITMAP, 150, 100, LR_LOADFROMFILE);
  LeftImage = LoadImage(0, "left.bmp", IMAGE_BITMAP, 150, 100, LR_LOADFROMFILE);



  WNDCLASS wc;
  memset(&wc, 0, sizeof(WNDCLASS));
  wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
  wc.lpfnWndProc = DialogProc;
  wc.hInstance = InstanceHandle;
  wc.hbrBackground = (HBRUSH )(COLOR_BTNFACE + 1);
  wc.lpszClassName = "WhateverClass";
  wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  if(!RegisterClass(&wc))
      return FALSE;

  WindowHandle = CreateWindow("WhateverClass",
                              "Switch Mousebuttons", // Caption text
                              WS_VISIBLE | WS_CLIPSIBLINGS |
                              WS_CLIPCHILDREN | WS_CAPTION | WS_BORDER | WS_SYSMENU,
                              100, 100, 150, 100,  // Position
                              NULL,
                              NULL,
                              InstanceHandle,
                              0);
  SendDlgItemMessage(WindowHandle, IDC_BUTTON1, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM )LeftImage);
  MSG Msg;
  while(GetMessage(&Msg, WindowHandle, 0, 0xFFFF) > 0)
  {
      if(!IsDialogMessage(WindowHandle, &Msg))
      {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
      }
  }

  UnInstallHook();
  return 0;
}

Det virker ikke helt.. HVad har jeg gjort forkert. Hvis jeg skal finde et godt sted at finde de forskellige parameter er det så msdn? Er det forresten muligt at fjerne titellinjen, altså den blå bjælke!
Avatar billede bertelbrander Novice
06. februar 2006 - 23:08 #18
Der hvor du opretter "knappen" skal du bruge SS_BITMAP:
      CreateWindow("STATIC",
                  "Push Me",
                  WS_CHILD | WS_VISIBLE | SS_BITMAP,
                  5, 5, 160, 110,
                  hwndDlg,
                  (HMENU)(IDC_BUTTON1),
                  InstanceHandle,
                  0);

Og så skal du ændre den linie i main hvor du sætter den første bitmap til:
  SendDlgItemMessage(WindowHandle, IDC_BUTTON1, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM )HoejreImage);
dvs STM_SETIMAGE og ikke BM_SETIMAGE

Ja, msdn er stedet at finde info.

Jeg prøver lige at fjerne bjælken.
Avatar billede bertelbrander Novice
06. februar 2006 - 23:18 #19
Hvis du fjerner WS_CAPTION og WS_SYSMENU style når du opretter boxen burde det være nok:

  WindowHandle = CreateWindow("WhateverClass",
                              "Switch Mousebuttons", // Caption text
                              WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_BORDER,
                              100, 100, 154, 104,  // Position
                              NULL,
                              NULL,
                              InstanceHandle,
                              0);

Men det er det ikke, du skal fjerne den igen lige efter:
  SetWindowLong(WindowHandle, GWL_STYLE, GetWindowLong(WindowHandle, GWL_STYLE) & ~(WS_CAPTION | WS_SYSMENU));
Avatar billede mummikiks Nybegynder
07. februar 2006 - 02:30 #20
Hej Bertel...Tak for hjælpen...Jeg har været inde og kigge på msdn og ville finde noget omkring hvordan man lavede en popup menu når man højreklikkede, men kan ikke finde det derinde. OG et andet sidste spørgsmål før jeg lukker er om det er muligt at indsætte en ny bjælke foroven med mit eget grafik, som har samme egenskab som den tidligere, altså at man kan flytte rundt på vinduet.

Ser frem til at høre fra dig
Avatar billede bertelbrander Novice
07. februar 2006 - 19:45 #21
Med hensyn til "bjælke", du kan gøre det på to måder:
1: Sætte den til at have WS_CAPTION style og selv tegne bjælken ved WM_NCPAINT
2: Lave hele applikationen som et billede. Så skal du selv flytte.
Option 1 er nok det letteste men option 2 giver nok det bedste resultat.

Jeg prøver at lave et eksempel på en popup menu.
Avatar billede bertelbrander Novice
07. februar 2006 - 20:28 #22
Hvis vi starter med at lave et par id'er til vores menu items:
#define IDC_MENU_1  1202
#define IDC_MENU_2  1203

Kan vi lave en funktion til at lave popup menuen:
void CreatePop(int x, int y)
{
  HMENU PopupMenu = CreatePopupMenu();
  POINT p = {x, y};
  ClientToScreen(WindowHandle, &p);
  AppendMenu(PopupMenu, MF_STRING, IDC_MENU_1, "Menu 1");
  AppendMenu(PopupMenu, MF_STRING, IDC_MENU_2, "Menu 2");
  TrackPopupMenu(PopupMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON, p.x, p.y, 0, WindowHandle, 0);
}
Og kalde den fra WM_RBUTTONDOWN:
  case WM_RBUTTONDOWN:
      CreatePop(LOWORD(lParam), HIWORD(lParam));
      break;
Så mangler vi blot at fange beskeden der kommer når brugeren vælger et menu item:
  case WM_COMMAND:
      switch(LOWORD(wParam))
      {
      case IDC_MENU_1:
        MessageBox(WindowHandle, "Menu 1", "Whatever", MB_OK);
        break;
      case IDC_MENU_2:
        MessageBox(WindowHandle, "Menu 2", "Whatever", MB_OK);
        break;
      }
      break;
Avatar billede mummikiks Nybegynder
08. februar 2006 - 00:08 #23
Tak bertel. Rigtig god guide til popup, men som jeg forstår WM_NCPAINT, så er det en funktion jeg kan opfange i DialogProc. Eer det rigtigt? Når jeg så modtager denne kan jeg tegne en bjælke i mit tegneprogram og indsætte denne når en kald fra WM_NCPAINT kommer? Vil gerne have et lille eksempel? og ps skal jeg fjerne SetWindowLong(WindowHandle, GWL_STYLE, GetWindowLong(WindowHandle, GWL_STYLE) & ~(WS_CAPTION | WS_SYSMENU))
Avatar billede bertelbrander Novice
08. februar 2006 - 00:18 #24
Jeg må tilstå at jeg er blevet klogere...

Man burde kunne tegne caption ved WM_NCPAINT, men det virker ikke!
Måske fordi windows VIL have alle captions til at se ens ud og derfor selv tegner den og ignorerer det man selv tegner.

Så du er nok nødt til lave applikationen uden caption og så selv flytte boxen når brugeren trækker i den.
Avatar billede bertelbrander Novice
08. februar 2006 - 01:30 #25
Sad lige og legede lidt.
Fik lavet en applikation med min egen version af en caption (et billede, top.bmp som forventes at være 150*50 px) Den kan flyttes ved at trække i toppen.

#define _WIN32_WINNT 0x0500
#include <windows.h>
#include <stdio.h>

#ifndef LLMHF_INJECTED
#define LLMHF_INJECTED 1
#endif

#define IDC_BUTTON1  1200
#define IDC_STATIC_1 1201
#define IDC_MENU_1  1202
#define IDC_MENU_2  1203

HINSTANCE InstanceHandle;
HWND WindowHandle;
HHOOK MouseHook;
HANDLE LeftImage, HoejreImage, TopImage;

enum
{
  IDLE, WAIT_DOWN, WAIT_UP
}State = IDLE;

void SendKey(bool aDown, LONG aX, LONG aY, DWORD aTime)
{
  INPUT Input;
  memset(&Input, 0, sizeof(Input));
  Input.type = INPUT_MOUSE;
  Input.mi.dx = aX;
  Input.mi.dy = aY;
  if(aDown)
      Input.mi.dwFlags = MOUSEEVENTF_RIGHTDOWN;
  else
      Input.mi.dwFlags = MOUSEEVENTF_RIGHTUP;
  Input.mi.time = aTime;

  SendInput(1, &Input, sizeof(INPUT));
}

LRESULT LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
  if(nCode == HC_ACTION)
  {
      if(wParam == WM_LBUTTONDOWN && State == WAIT_DOWN)
      {
        MSLLHOOKSTRUCT *MouseStruct = (MSLLHOOKSTRUCT *)lParam;
        if(!(MouseStruct->flags & LLMHF_INJECTED))
        {
          SendDlgItemMessage(WindowHandle, IDC_BUTTON1, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM )HoejreImage);
            State = WAIT_UP;
            SendKey(true, MouseStruct->pt.x, MouseStruct->pt.y, MouseStruct->time);
            return TRUE;
        }
      }
      else if(wParam == WM_LBUTTONUP && State == WAIT_UP)
      {
        MSLLHOOKSTRUCT *MouseStruct = (MSLLHOOKSTRUCT *)lParam;
        if(!(MouseStruct->flags & LLMHF_INJECTED))
        {
            SendDlgItemMessage(WindowHandle, IDC_BUTTON1, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM )LeftImage);
            State = IDLE;
            SendKey(false, MouseStruct->pt.x, MouseStruct->pt.y, MouseStruct->time);
            return TRUE;
        }
      }
  }

  return CallNextHookEx(MouseHook, nCode, wParam, lParam);
}

void InstallHook(HWND hwndDlg)
{
  if(MouseHook)
      return;

  MouseHook = SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC  )LowLevelMouseProc, GetModuleHandle(0), 0);
  if(!MouseHook)
  {
      MessageBox(hwndDlg, "Failed to install Hook", "PageDown Remover", MB_OK);
  }
}

void UnInstallHook(void)
{
  if(MouseHook)
      UnhookWindowsHookEx(MouseHook);
  MouseHook = 0;
}

void CreatePop(int x, int y)
{
  HMENU PopupMenu = CreatePopupMenu();
  POINT p = {x, y};
  ClientToScreen(WindowHandle, &p);
  AppendMenu(PopupMenu, MF_STRING, IDC_MENU_1, "Menu 1");
  AppendMenu(PopupMenu, MF_STRING, IDC_MENU_2, "Menu 2");
  TrackPopupMenu(PopupMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON, p.x, p.y, 0, WindowHandle, 0);
}

bool Draging;
int DragX, DragY;

LRESULT CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
  switch(msg)
  {
  case WM_CREATE:
      CreateWindow("STATIC",
                  "Push Me",
                  WS_CHILD | WS_VISIBLE | SS_BITMAP,
                  0, 0, 150, 50,
                  hwndDlg,
                  (HMENU)(IDC_STATIC_1),
                  InstanceHandle,
                  0);
      CreateWindow("STATIC",
                  "Push Me",
                  WS_CHILD | WS_VISIBLE | SS_BITMAP,
                  0, 50, 150, 100,
                  hwndDlg,
                  (HMENU)(IDC_BUTTON1),
                  InstanceHandle,
                  0);

      InstallHook(hwndDlg);
      break;
  case WM_COMMAND:
      switch(LOWORD(wParam))
      {
      case IDC_MENU_1:
        MessageBox(WindowHandle, "Menu 1", "Whatever", MB_OK);
        break;
      case IDC_MENU_2:
        MessageBox(WindowHandle, "Menu 2", "Whatever", MB_OK);
        break;
      }
      break;
  case WM_LBUTTONUP:
      if(Draging)
      {
        Draging = false;
        ReleaseCapture();
      }
      break;
  case WM_MOUSEMOVE:
      if(Draging)
      {
        POINT P = {LOWORD(lParam), HIWORD(lParam)};
        P.x -= DragX;
        P.y -= DragY;
        ClientToScreen(hwndDlg, &P);
        MoveWindow(hwndDlg, P.x, P.y, 150, 150, TRUE);
      }
      break;
  case WM_LBUTTONDOWN:
      if(HIWORD(lParam) > 50)
      {
        SendDlgItemMessage(hwndDlg, IDC_BUTTON1, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM )HoejreImage);
        State = WAIT_DOWN;
      }
      else
      {
        DragX = LOWORD(lParam);
        DragY = HIWORD(lParam);
        Draging = true;
        SetCapture(hwndDlg);
      }
      break;
  case WM_RBUTTONDOWN:
      CreatePop(LOWORD(lParam), HIWORD(lParam));
      break;
  }
  return DefWindowProc(hwndDlg, msg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, INT)
{
  InstanceHandle = hInstance;
  HoejreImage = LoadImage(0, "hoejre.bmp", IMAGE_BITMAP, 150, 100, LR_LOADFROMFILE);
  LeftImage = LoadImage(0, "left.bmp", IMAGE_BITMAP, 150, 100, LR_LOADFROMFILE);
  TopImage = LoadImage(0, "top.bmp", IMAGE_BITMAP, 150, 100, LR_LOADFROMFILE);

  WNDCLASS wc;
  memset(&wc, 0, sizeof(WNDCLASS));
  wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
  wc.lpfnWndProc = DialogProc;
  wc.hInstance = InstanceHandle;
  wc.hbrBackground = (HBRUSH )(COLOR_BTNFACE + 1);
  wc.lpszClassName = "WhateverClass";
  wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  if(!RegisterClass(&wc))
      return FALSE;

  WindowHandle = CreateWindow("WhateverClass",
                              0, // "Switch Mousebuttons", // Caption text
                              WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
                              100, 100, 150, 150,  // Position
                              NULL,
                              NULL,
                              InstanceHandle,
                              0);

  SendDlgItemMessage(WindowHandle, IDC_STATIC_1, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM )TopImage);
  SendDlgItemMessage(WindowHandle, IDC_BUTTON1, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM )HoejreImage);
  SetWindowLong(WindowHandle, GWL_STYLE, GetWindowLong(WindowHandle, GWL_STYLE) & ~(WS_CAPTION | WS_SYSMENU | WS_BORDER));

  MSG Msg;
  while(GetMessage(&Msg, WindowHandle, 0, 0xFFFF) > 0)
  {
      if(!IsDialogMessage(WindowHandle, &Msg))
      {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
      }
  }

  UnInstallHook();
  return 0;
}
Avatar billede mummikiks Nybegynder
08. februar 2006 - 15:43 #26
Hej så er jeg ved at have lavet den færdige løsning. Jeg har smidt den op med sourcekode og billeder på
http://www.control.aau.dk/~05gr551/Switchtest.rar

Mit problem ligger i at jeg skal have lavet billedet transperant. Billderne ligger som transperante billeder i ovenstående fil, altså som png billeder. Hvordan kan jeg sætte disse ind og lade applikationen være transperant?
Avatar billede mummikiks Nybegynder
08. februar 2006 - 18:51 #27
Jeg har fundet følgende link, som vel er måden på at lave det eller hvad?
Avatar billede mummikiks Nybegynder
08. februar 2006 - 18:55 #28
Avatar billede bertelbrander Novice
08. februar 2006 - 20:16 #29
En anden (og lidt simplere) metode:
http://home20.inet.tele.dk/midgaard/tipwin20050329.html

Ideén er at du definerer en farve i din baggrunds .bmp som skal være transparent.
Avatar billede mummikiks Nybegynder
08. februar 2006 - 20:33 #30
Ohh tak... ser simplere ud, men kan ikke compile, får et mærkeligt output

Compiler: Default compiler
Executing  g++.exe...
g++.exe "C:\Documents and Settings\Karsten\Desktop\TestTRans\mouse.cpp" -o "C:\Documents and Settings\Karsten\Desktop\TestTRans\mouse.exe"  -g3  -I"I:\Programmer\Dev-Cpp\lib\gcc\mingw32\3.4.2\include"  -I"I:\Programmer\Dev-Cpp\include\c++\3.4.2\backward"  -I"I:\Programmer\Dev-Cpp\include\c++\3.4.2\mingw32"  -I"I:\Programmer\Dev-Cpp\include\c++\3.4.2"  -I"I:\Programmer\Dev-Cpp\include"  -L"I:\Programmer\Dev-Cpp\lib" -g3
In file included from I:/Programmer/Dev-Cpp/include/windows.h:52,
                from C:\Documents and Settings\Karsten\Desktop\TestTRans\mouse.cpp:2:
I:/Programmer/Dev-Cpp/include/wingdi.h:2498: error: typedef `ABORTPROC' is initialized (use __typeof__ instead)
I:/Programmer/Dev-Cpp/include/wingdi.h:2498: error: `HDC' was not declared in this scope
I:/Programmer/Dev-Cpp/include/wingdi.h:2498: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2499: error: typedef `MFENUMPROC' is initialized (use __typeof__ instead)
I:/Programmer/Dev-Cpp/include/wingdi.h:2499: error: `HDC' was not declared in this scope

I:/Programmer/Dev-Cpp/include/wingdi.h:2499: error: expected primary-expression before '*' token
I:/Programmer/Dev-Cpp/include/wingdi.h:2499: error: expected primary-expression before ',' token
I:/Programmer/Dev-Cpp/include/wingdi.h:2499: error: expected primary-expression before '*' token
I:/Programmer/Dev-Cpp/include/wingdi.h:2499: error: expected primary-expression before ',' token
I:/Programmer/Dev-Cpp/include/wingdi.h:2499: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2499: error: expected primary-expression before ')' token
I:/Programmer/Dev-Cpp/include/wingdi.h:2500: error: typedef `ENHMFENUMPROC' is initialized (use __typeof__ instead)
I:/Programmer/Dev-Cpp/include/wingdi.h:2500: error: `HDC' was not declared in this scope
I:/Programmer/Dev-Cpp/include/wingdi.h:2500: error: expected primary-expression before '*' token
I:/Programmer/Dev-Cpp/include/wingdi.h:2500: error: expected primary-expression before ',' token
I:/Programmer/Dev-Cpp/include/wingdi.h:2500: error: expected primary-expression before '*' token
I:/Programmer/Dev-Cpp/include/wingdi.h:2500: error: expected primary-expression before ',' token
I:/Programmer/Dev-Cpp/include/wingdi.h:2500: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2500: error: expected primary-expression before ')' token
I:/Programmer/Dev-Cpp/include/wingdi.h:2529: error: `HDC' was not declared in this scope
I:/Programmer/Dev-Cpp/include/wingdi.h:2530: error: `HDC' was not declared in this scope
I:/Programmer/Dev-Cpp/include/wingdi.h:2538: error: `HDC' was not declared in this scope
I:/Programmer/Dev-Cpp/include/wingdi.h:2538: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2538: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2538: error: expected primary-expression before ',' token
I:/Programmer/Dev-Cpp/include/wingdi.h:2538: error: expected primary-expression before ',' token
I:/Programmer/Dev-Cpp/include/wingdi.h:2538: error: expected primary-expression before ')' token
I:/Programmer/Dev-Cpp/include/wingdi.h:2538: error: initializer expression list treated as compound expression
I:/Programmer/Dev-Cpp/include/wingdi.h:2540: error: `HDC' was not declared in this scope
I:/Programmer/Dev-Cpp/include/wingdi.h:2540: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2540: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2540: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2540: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2540: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2540: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2540: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2540: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2540: error: initializer expression list treated as compound expression
I:/Programmer/Dev-Cpp/include/wingdi.h:2541: error: `HDC' was not declared in this scope
I:/Programmer/Dev-Cpp/include/wingdi.h:2541: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2541: error: expected primary-expression before "int"

I:/Programmer/Dev-Cpp/include/wingdi.h:2541: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2541: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2541: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2541: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2541: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2541: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2541: error: initializer expression list treated as compound expression
I:/Programmer/Dev-Cpp/include/wingdi.h:2542: error: `HDC' was not declared in this scope
I:/Programmer/Dev-Cpp/include/wingdi.h:2543: error: `HDC' was not declared in this scope
I:/Programmer/Dev-Cpp/include/wingdi.h:2543: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2543: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2543: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2543: error: expected primary-expression before "int"

I:/Programmer/Dev-Cpp/include/wingdi.h:2543: error: `HDC' was not declared in this scope
I:/Programmer/Dev-Cpp/include/wingdi.h:2543: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2543: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2543: error: expected primary-expression before ')' token
I:/Programmer/Dev-Cpp/include/wingdi.h:2543: error: initializer expression list treated as compound expression
I:/Programmer/Dev-Cpp/include/wingdi.h:2544: error: `HDC' was not declared in this scope
I:/Programmer/Dev-Cpp/include/wingdi.h:2545: error: `HDC' was not declared in this scope
I:/Programmer/Dev-Cpp/include/wingdi.h:2545: error: expected primary-expression before ',' token
I:/Programmer/Dev-Cpp/include/wingdi.h:2545: error: expected primary-expression before ',' token

I:/Programmer/Dev-Cpp/include/wingdi.h:2545: error: expected primary-expression before ')' token
I:/Programmer/Dev-Cpp/include/wingdi.h:2545: error: initializer expression list treated as compound expression
I:/Programmer/Dev-Cpp/include/wingdi.h:2546: error: `HDC' was not declared in this scope
I:/Programmer/Dev-Cpp/include/wingdi.h:2546: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2546: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2546: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2546: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2546: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2546: error: expected primary-expression before "int"

I:/Programmer/Dev-Cpp/include/wingdi.h:2546: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2546: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2546: error: initializer expression list treated as compound expression
I:/Programmer/Dev-Cpp/include/wingdi.h:2547: error: `HDC' was not declared in this scope
I:/Programmer/Dev-Cpp/include/wingdi.h:2547: error: expected primary-expression before "const"
I:/Programmer/Dev-Cpp/include/wingdi.h:2547: error: initializer expression list treated as compound expression
I:/Programmer/Dev-Cpp/include/wingdi.h:2548: error: `HDC' was not declared in this scope

I:/Programmer/Dev-Cpp/include/wingdi.h:2549: error: `HDC' was not declared in this scope
I:/Programmer/Dev-Cpp/include/wingdi.h:2550: error: `HDC' was not declared in this scope
I:/Programmer/Dev-Cpp/include/wingdi.h:2551: error: `HDC' was not declared in this scope
I:/Programmer/Dev-Cpp/include/wingdi.h:2551: error: `HDC' was not declared in this scope
I:/Programmer/Dev-Cpp/include/wingdi.h:2551: error: expected primary-expression before ')' token
I:/Programmer/Dev-Cpp/include/wingdi.h:2551: error: initializer expression list treated as compound expression

I:/Programmer/Dev-Cpp/include/wingdi.h:2563: error: `HDC' was not declared in this scope
I:/Programmer/Dev-Cpp/include/wingdi.h:2563: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2563: error: expected primary-expression before "int"
I:/Programmer/Dev-Cpp/include/wingdi.h:2563: error: initializer expression list treated as compound expression
I:/Programmer/Dev-Cpp/include/wingdi.h:2564: error: expected constructor, destructor, or type conversion before "CreateCompatibleDC"
I:/Programmer/Dev-Cpp/include/wingdi.h:2564: error: expected `,' or `;' before "CreateCompatibleDC"
I:/Programmer/Dev-Cpp/include/wingdi.h:2565: error: expected constructor, destructor, or type conversion before "CreateDCA"
I:/Programmer/Dev-Cpp/include/wingdi.h:2565: error: expected `,' or `;' before "CreateDCA"
I:/Programmer/Dev-Cpp/include/wingdi.h:2566: error: expected constructor, destructor, or type conversion before "CreateDCW"
I:/Programmer/Dev-Cpp/include/wingdi.h:2566: error: expected `,' or `;' before "CreateDCW"
I:/Programmer/Dev-Cpp/include/wingdi.h:2567: error: `HDC' was not declared in this scope
I:/Programmer/Dev-Cpp/include/wingdi.h:2567: error: expected primary-expression before "const"
I:/Programmer/Dev-Cpp/include/wingdi.h:2567: error: expected primary-expression before ',' token
I:/Programmer/Dev-Cpp/include/wingdi.h:2567: error: expected primary-expression before ',' token

Er det ikke mærkeligt?
Avatar billede bertelbrander Novice
08. februar 2006 - 20:40 #31
Jo det er mærkeligt.
Der skulle vel ske det samme som med dit eget program, de to første linjer er de samme.

Hvad står der i wingdi.h linje 2498?
Jeg har:
typedef BOOL (CALLBACK *ABORTPROC)(HDC,int);
Avatar billede mummikiks Nybegynder
08. februar 2006 - 20:44 #32
Ja der står det samme..

typedef BOOL (CALLBACK *ABORTPROC)(HDC,int);

direkte kopieret!
Avatar billede bertelbrander Novice
08. februar 2006 - 20:46 #33
Men hvorfor virker det så i den ene .cpp fil men ikke i den anden?
Oversætter du på samme måde?
Avatar billede mummikiks Nybegynder
08. februar 2006 - 21:04 #34
Hmm installerede compileren forfra og nu kommer følgende istedet:

Compiler: Default compiler
Executing  g++.exe...
g++.exe "C:\Documents and Settings\Karsten\Desktop\TestTRans\mouse.cpp" -o "C:\Documents and Settings\Karsten\Desktop\TestTRans\mouse.exe"    -I"I:\Programmer\Dev-Cpp\lib\gcc\mingw32\3.4.2\include"  -I"I:\Programmer\Dev-Cpp\include\c++\3.4.2\backward"  -I"I:\Programmer\Dev-Cpp\include\c++\3.4.2\mingw32"  -I"I:\Programmer\Dev-Cpp\include\c++\3.4.2"  -I"I:\Programmer\Dev-Cpp\include"  -L"I:\Programmer\Dev-Cpp\lib"
C:\DOCUME~1\Karsten\LOCALS~1\Temp/cceWbaaa.o(.text+0x4c):mouse.cpp: undefined reference to `CreateCompatibleDC@4'
C:\DOCUME~1\Karsten\LOCALS~1\Temp/cceWbaaa.o(.text+0x66):mouse.cpp: undefined reference to `SelectObject@8'
C:\DOCUME~1\Karsten\LOCALS~1\Temp/cceWbaaa.o(.text+0xb3):mouse.cpp: undefined reference to `BitBlt@36'
C:\DOCUME~1\Karsten\LOCALS~1\Temp/cceWbaaa.o(.text+0xc1):mouse.cpp: undefined reference to `DeleteDC@4'
collect2: ld returned 1 exit status

Execution terminated
Avatar billede mummikiks Nybegynder
08. februar 2006 - 21:04 #35
Nogen forklaring?
Avatar billede bertelbrander Novice
08. februar 2006 - 21:31 #36
Se, det er jo fejl man kan forstå :-)
Du skal blot tilføje libgdi32.a til linkeren.
Avatar billede mummikiks Nybegynder
08. februar 2006 - 21:45 #37
Kanon..så spiller det...nu har jeg taget mit billede og lagt farven 0C 0C 0C ind hvor djeg ønsker at det skal være transperant. Du skriver i din tutorial at denne farve skal være grå, men for mig er den sort og faktum er at denne farve ikke bliver fjernet.

Billedet jeg har anvendt ligger her:
http://www.control.aau.dk/~05gr551/Switchtest.rar

åHar jeg gjort noget forkert?
Avatar billede mummikiks Nybegynder
08. februar 2006 - 21:46 #38
Avatar billede bertelbrander Novice
08. februar 2006 - 21:50 #39
Du vælger selv hvilken farve der skal være transparent, du sætter den med:

      SetLayeredWindowAttributes(hwndDlg,
                                RGB(0xC0, 0xC0, 0xC0),
                                0,
                                LWA_COLORKEY);

Hvor du så vil have RGB(0x0C, 0x0C, 0x0C)
Avatar billede mummikiks Nybegynder
08. februar 2006 - 21:55 #40
Præcis... Jeg har bare taget sourcekoden fra din hjemmeside og prøvet med mit billede med den rigtige farve, men uden success..Er det ikke mærkeligt?
Avatar billede bertelbrander Novice
08. februar 2006 - 22:03 #41
Du skal sørge for at bruge den rigtige størrelse på billedet, både når du opretter vinduet, når du loader billedet og ved bitblt DrawWindow.
Avatar billede mummikiks Nybegynder
08. februar 2006 - 22:06 #42
#define _WIN32_WINNT 0x0500
#include <windows.h>

#define IDC_BUTTON1  1200

HINSTANCE InstanceHandle;
bool Running = true;
HBITMAP BackBitMap;

BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam)
{
  InvalidateRect(hwnd, 0, TRUE);
  return TRUE;
}

void DrawWindow(HWND hwnd)
{
  HDC DC = GetWindowDC(hwnd);
  HDC MemDC = CreateCompatibleDC(DC);
  SelectObject(MemDC, BackBitMap);
  BitBlt(DC, 0, 0, 113, 189, MemDC, 0, 0, SRCCOPY);
  DeleteDC(MemDC);
  ReleaseDC(hwnd, DC);
  EnumChildWindows(hwnd, EnumChildProc, 0);
}

LRESULT CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
  switch(msg)
  {
  case WM_CREATE:
      CreateWindow("BUTTON",
                  "Push Me",
                  WS_CHILD | WS_VISIBLE,
                  25, 10, 100, 30,
                  hwndDlg,
                  (HMENU)(IDC_BUTTON1),
                  InstanceHandle,
                  0);
      BackBitMap = (HBITMAP )LoadImage(0, "round.bmp", IMAGE_BITMAP, 113, 189, LR_LOADFROMFILE);
      SetWindowLong(hwndDlg, GWL_EXSTYLE, GetWindowLong(hwndDlg, GWL_EXSTYLE) | WS_EX_LAYERED);
      SetLayeredWindowAttributes(hwndDlg, RGB(0xC0, 0xC0, 0xC0), 0, LWA_COLORKEY);
      DrawWindow(hwndDlg);
      break;
  case WM_PAINT:
  {
      PAINTSTRUCT PaintStruct;
      BeginPaint(hwndDlg, &PaintStruct);
      EndPaint(hwndDlg, &PaintStruct);
  }
  case WM_ACTIVATE:
  case WM_NCACTIVATE:
  case WM_NCPAINT:
  {
      DrawWindow(hwndDlg);
      return 0;
  }
  case WM_COMMAND:
      EndDialog(hwndDlg, 0);
      Running = false;
      break;
  }
  return DefWindowProc(hwndDlg, msg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, INT nCmdShow)
{
  InstanceHandle = hInstance;

  WNDCLASS wc;
  memset(&wc, 0, sizeof(WNDCLASS));
  wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
  wc.lpfnWndProc = DialogProc;
  wc.hInstance = InstanceHandle;
  wc.hbrBackground = (HBRUSH )(COLOR_BTNFACE + 1);
  wc.lpszClassName = "WhateverClass";
  wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  if(!RegisterClass(&wc))
      return FALSE;

  HWND WindowHandle = CreateWindow("WhateverClass",
                                    "",
                                    WS_VISIBLE,
                                    300, 100, 113, 189,
                                    NULL,
                                    NULL,
                                    InstanceHandle,
                                    0);
  MSG Msg;
  while(Running && GetMessage(&Msg, WindowHandle, 0, 0xFFFF) > 0)
  {
      if(!IsDialogMessage(WindowHandle, &Msg))
      {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
      }
  }
  return 0;
}
Avatar billede mummikiks Nybegynder
08. februar 2006 - 22:07 #43
Jeg har blot angivet billedets størrelse. Aflæst ved at højreklikke-> egenskaber på billedet. Skal jeg kompensere for den fjernede caption eller noget
Avatar billede mummikiks Nybegynder
08. februar 2006 - 22:07 #44
?
Avatar billede bertelbrander Novice
08. februar 2006 - 22:10 #45
Skal det ikke være 0x0C i denne linje?

SetLayeredWindowAttributes(hwndDlg, RGB(0xC0, 0xC0, 0xC0), 0, LWA_COLORKEY);

Jeg har det til at virke, næsten... Den tegner en underlig box til højre for billedet...
Avatar billede mummikiks Nybegynder
08. februar 2006 - 22:26 #46
Selvfølgelig...Har haft problemet med den streg hele dagen. Har prøveet at resize vinduerne og billederne. Intet ved hjælper. Ved det tidligere eksempel som denne tråd startede med, gik det væk når jeg draggede med den. Det er mega træls. Hvad kan det stamme fra?
Avatar billede bertelbrander Novice
08. februar 2006 - 22:29 #47
Hvis jeg laver billedet 124 px bred og ændrer alle 113 til 124 virker det...
Avatar billede mummikiks Nybegynder
08. februar 2006 - 22:31 #48
Ha...hvor er det store videnskabelige bevis? -:) Jeg tjekker det lige og så tror jeg snart det er lukke tid. Tusind tak..din hjælp har være uvurderlig. Havde godtnok ikke troet at denne verden var så forskellig som swing, men dejligt at se at tingene går stærkt iforhold til java
Avatar billede mummikiks Nybegynder
09. februar 2006 - 00:11 #49
Hej Bertel

Nu har jeg merged de to koder, men har problemer med at skifte billede. Den skifter faktisk fint til højre, men ikke til venstre igen.

Kan du se problemet??


#define _WIN32_WINNT 0x0500
#include <windows.h>
#include <stdio.h>

#ifndef LLMHF_INJECTED
#define LLMHF_INJECTED 1
#endif

#define IDC_BUTTON2  1200
#define IDC_BUTTON1  1201
#define IDC_STATIC_1 1202

HINSTANCE InstanceHandle;
bool Running = true;
HBITMAP BackBitMap;

HWND WindowHandle;
HHOOK MouseHook;
HANDLE LeftImage, RightImage, CloseImage;

enum
{
  IDLE, WAIT_DOWN, WAIT_UP
}State = IDLE;

void SendKey(bool aDown, LONG aX, LONG aY, DWORD aTime)
{
  INPUT Input;
  memset(&Input, 0, sizeof(Input));
  Input.type = INPUT_MOUSE;
  Input.mi.dx = aX;
  Input.mi.dy = aY;
  if(aDown)
      Input.mi.dwFlags = MOUSEEVENTF_RIGHTDOWN;
  else
      Input.mi.dwFlags = MOUSEEVENTF_RIGHTUP;
  Input.mi.time = aTime;

  SendInput(1, &Input, sizeof(INPUT));
}

LRESULT LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
  if(nCode == HC_ACTION)
  {
      if(wParam == WM_LBUTTONDOWN && State == WAIT_DOWN)
      {
        MSLLHOOKSTRUCT *MouseStruct = (MSLLHOOKSTRUCT *)lParam;
        if(!(MouseStruct->flags & LLMHF_INJECTED))
        {
            SendDlgItemMessage(WindowHandle, IDC_BUTTON1, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM )RightImage);
            SendDlgItemMessage(WindowHandle, IDC_BUTTON2, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM )CloseImage);
            State = WAIT_UP;
            SendKey(true, MouseStruct->pt.x, MouseStruct->pt.y, MouseStruct->time);
            return TRUE;
        }
      }
      else if(wParam == WM_LBUTTONUP && State == WAIT_UP)
      {
        MSLLHOOKSTRUCT *MouseStruct = (MSLLHOOKSTRUCT *)lParam;
        if(!(MouseStruct->flags & LLMHF_INJECTED))
        {
            SendDlgItemMessage(WindowHandle, IDC_BUTTON1, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM )LeftImage);
            SendDlgItemMessage(WindowHandle, IDC_BUTTON2, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM )CloseImage);
            State = IDLE;
            SendKey(false, MouseStruct->pt.x, MouseStruct->pt.y, MouseStruct->time);
            return TRUE;
        }
      }
  }

  return CallNextHookEx(MouseHook, nCode, wParam, lParam);
}

void InstallHook(HWND hwndDlg)
{
  if(MouseHook)
      return;

  MouseHook = SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC  )LowLevelMouseProc, GetModuleHandle(0), 0);
  if(!MouseHook)
  {
      MessageBox(hwndDlg, "Failed to install Hook", "PageDown Remover", MB_OK);
  }
}

void UnInstallHook(void)
{
  if(MouseHook)
      UnhookWindowsHookEx(MouseHook);
  MouseHook = 0;
}

bool Draging;
int DragX, DragY;


BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam)
{
  InvalidateRect(hwnd, 0, TRUE);
  return TRUE;
}

void DrawWindow(HWND hwnd)
{
  HDC DC = GetWindowDC(hwnd);
  HDC MemDC = CreateCompatibleDC(DC);
  SelectObject(MemDC, BackBitMap);
  BitBlt(DC, 0, 0, 124, 189, MemDC, 0, 0, SRCCOPY);
  DeleteDC(MemDC);
  ReleaseDC(hwnd, DC);
  EnumChildWindows(hwnd, EnumChildProc, 0);
}

LRESULT CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
  switch(msg)
  {
  case WM_CREATE:
     
      CreateWindow("STATIC",
                  "Push Me",
                  WS_CHILD | WS_VISIBLE | SS_BITMAP,
                  0, 0, 224, 189,
                  hwndDlg,
                  (HMENU)(IDC_BUTTON1),
                  InstanceHandle,
                  0);
      CreateWindow("BUTTON",
                  "Close",                       
                  WS_CHILD | WS_VISIBLE | BS_BITMAP,
                  60, 94, 28, 29,
                  hwndDlg,
                  (HMENU)(IDC_BUTTON2),
                  InstanceHandle, 
                  0);
     
                 
      InstallHook(hwndDlg);           
      BackBitMap = (HBITMAP )LoadImage(0, "left_Click.bmp", IMAGE_BITMAP, 127, 189, LR_LOADFROMFILE);
      SetWindowLong(hwndDlg, GWL_EXSTYLE, GetWindowLong(hwndDlg, GWL_EXSTYLE) | WS_EX_LAYERED);
      SetLayeredWindowAttributes(hwndDlg, RGB(0xC0, 0xC0, 0xC0), 0, LWA_COLORKEY);
      DrawWindow(hwndDlg);
      break;
  case WM_PAINT:
  {
      PAINTSTRUCT PaintStruct;
      BeginPaint(hwndDlg, &PaintStruct);
      EndPaint(hwndDlg, &PaintStruct);
  }
  case WM_ACTIVATE:
  case WM_NCACTIVATE:
  case WM_NCPAINT:
  {
      DrawWindow(hwndDlg);
      return 0;
  }
  case WM_COMMAND:
        DestroyWindow(WindowHandle);
      break;
 
  case WM_LBUTTONUP:
      if(Draging)
      {
        Draging = false;
        ReleaseCapture();
      }
      break;
  case WM_MOUSEMOVE:
      if(Draging)
      {
        POINT P = {LOWORD(lParam), HIWORD(lParam)};
        P.x -= DragX;
        P.y -= DragY;
        ClientToScreen(hwndDlg, &P);
        MoveWindow(hwndDlg, P.x, P.y, 124, 189, TRUE);
      }
      break;
  case WM_LBUTTONDOWN:
      if(HIWORD(lParam) < 63)
      {
        SendDlgItemMessage(hwndDlg, IDC_BUTTON1, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM )RightImage);
        SendDlgItemMessage(WindowHandle, IDC_BUTTON2, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM )CloseImage);

        State = WAIT_DOWN;
      }
      else
      {
        DragX = LOWORD(lParam);
        DragY = HIWORD(lParam);
        Draging = true;
        SetCapture(hwndDlg);
      }
      break;
  }
  return DefWindowProc(hwndDlg, msg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, INT nCmdShow)
{
  InstanceHandle = hInstance;
    CloseImage = LoadImage(0, "Close.bmp", IMAGE_BITMAP, 28, 29, LR_LOADFROMFILE);
    RightImage = LoadImage(0, "right_Click.bmp", IMAGE_BITMAP, 124, 189, LR_LOADFROMFILE);
    LeftImage = LoadImage(0, "left_Click.bmp", IMAGE_BITMAP, 124, 189, LR_LOADFROMFILE);

  WNDCLASS wc;
  memset(&wc, 0, sizeof(WNDCLASS));
  wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
  wc.lpfnWndProc = DialogProc;
  wc.hInstance = InstanceHandle;
  wc.hbrBackground = (HBRUSH )(COLOR_BTNFACE + 1);
  wc.lpszClassName = "WhateverClass";
  wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  if(!RegisterClass(&wc))
      return FALSE;

  HWND WindowHandle = CreateWindow("WhateverClass",
                                    "",
                                    WS_VISIBLE,
                                    300, 100, 124, 189,
                                    NULL,
                                    NULL,
                                    InstanceHandle,
                                    0);
  SendDlgItemMessage(WindowHandle, IDC_BUTTON2, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM )CloseImage);
  SendDlgItemMessage(WindowHandle, IDC_BUTTON1, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM )RightImage);
  SetWindowLong(WindowHandle, GWL_STYLE, GetWindowLong(WindowHandle, GWL_STYLE) & ~(WS_CAPTION | WS_SYSMENU | WS_BORDER));

  MSG Msg;
  while(Running && GetMessage(&Msg, WindowHandle, 0, 0xFFFF) > 0)
  {
      if(!IsDialogMessage(WindowHandle, &Msg))
      {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
      }
  }
  return 0;
}
Avatar billede bertelbrander Novice
09. februar 2006 - 00:45 #50
Jeg bliver lige lidt forvirret.

Nu har du både en back-bitmap som er den du bruger i DrawWindow og en left og en right bitmap som er den du skifter mellem.
Men de dækker så vidt jeg kan se det samme område...
Så du skal have DrawWindow til at tegne med enten left eller right bitmap efter hvad der er valgt.
DrawWindow skal nok også tegne knappen (som såvidt jeg kan se altid bruge samme bitmap).
Avatar billede mummikiks Nybegynder
09. februar 2006 - 02:54 #51
Ohh ja det er rigtigt...Den bedste måde ville vel være kun at ændre back-bitmap.ik? men kan man skifte dem løbende? og hvordan switcher jeg i drawWindow, ligesom i LRESUÆT?
Avatar billede bertelbrander Novice
09. februar 2006 - 20:35 #52
Det letteste er nok at lave en global:
HANDLE CurrentImage;

Som du sætter til at være det nuværende billede. I DrawWindow bruger du så den når du tegner.

Når du skifter billede skal du kalde DrawWindow, du behøver ikke sende XXX_SETIMAGE.
Avatar billede mummikiks Nybegynder
15. februar 2006 - 10:59 #53
Hej Bertel

Jeg har lavet følgende switch i min draw window, samt lavet den globale handle CurrentImage., men hvordan skal jeg nu skifte billedet?
Avatar billede bertelbrander Novice
15. februar 2006 - 20:56 #54
Jeg tror at du ville have skrevet noget mere?

Man kunne bruge noget i stil med dette:

#define _WIN32_WINNT 0x0500
#include <windows.h>
#include <stdio.h>

#ifndef LLMHF_INJECTED
#define LLMHF_INJECTED 1
#endif

#define IDC_BUTTON2  1200
#define IDC_BUTTON1  1201
#define IDC_STATIC_1 1202

HINSTANCE InstanceHandle;
bool Running = true;

HWND WindowHandle;
HHOOK MouseHook;
HANDLE LeftImage, RightImage, CurrentImage;

enum
{
  IDLE, WAIT_DOWN, WAIT_UP
}State = IDLE;

BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam)
{
  InvalidateRect(hwnd, 0, TRUE);
  return TRUE;
}

void DrawWindow(HWND hwnd)
{
  HDC DC = GetWindowDC(hwnd);
  HDC MemDC = CreateCompatibleDC(DC);
  SelectObject(MemDC, CurrentImage);
  BitBlt(DC, 0, 0, 150, 100, MemDC, 0, 0, SRCCOPY);
  DeleteDC(MemDC);
  ReleaseDC(hwnd, DC);
  EnumChildWindows(hwnd, EnumChildProc, 0);
}


void SendKey(bool aDown, LONG aX, LONG aY, DWORD aTime)
{
  INPUT Input;
  memset(&Input, 0, sizeof(Input));
  Input.type = INPUT_MOUSE;
  Input.mi.dx = aX;
  Input.mi.dy = aY;
  if(aDown)
      Input.mi.dwFlags = MOUSEEVENTF_RIGHTDOWN;
  else
      Input.mi.dwFlags = MOUSEEVENTF_RIGHTUP;
  Input.mi.time = aTime;

  SendInput(1, &Input, sizeof(INPUT));
}

LRESULT LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
  if(nCode == HC_ACTION)
  {
      if(wParam == WM_LBUTTONDOWN && State == WAIT_DOWN)
      {
        MSLLHOOKSTRUCT *MouseStruct = (MSLLHOOKSTRUCT *)lParam;
        if(!(MouseStruct->flags & LLMHF_INJECTED))
        {
            State = WAIT_UP;
            CurrentImage = LeftImage;
            DrawWindow(WindowHandle);
            SendKey(true, MouseStruct->pt.x, MouseStruct->pt.y, MouseStruct->time);
            return TRUE;
        }
      }
      else if(wParam == WM_LBUTTONUP && State == WAIT_UP)
      {
        MSLLHOOKSTRUCT *MouseStruct = (MSLLHOOKSTRUCT *)lParam;
        if(!(MouseStruct->flags & LLMHF_INJECTED))
        {
            State = IDLE;
            SendKey(false, MouseStruct->pt.x, MouseStruct->pt.y, MouseStruct->time);
            return TRUE;
        }
      }
  }

  return CallNextHookEx(MouseHook, nCode, wParam, lParam);
}

void InstallHook(HWND hwndDlg)
{
  if(MouseHook)
      return;

  MouseHook = SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC  )LowLevelMouseProc, GetModuleHandle(0), 0);
  if(!MouseHook)
  {
      MessageBox(hwndDlg, "Failed to install Hook", "PageDown Remover", MB_OK);
  }
}

void UnInstallHook(void)
{
  if(MouseHook)
      UnhookWindowsHookEx(MouseHook);
  MouseHook = 0;
}

bool Draging;
int DragX, DragY;

LRESULT CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
  switch(msg)
  {
  case WM_CREATE:

      CreateWindow("BUTTON",
                  "Close",
                  WS_CHILD | WS_VISIBLE | BS_BITMAP,
                  60, 94, 28, 29,
                  hwndDlg,
                  (HMENU)(IDC_BUTTON2),
                  InstanceHandle,
                  0);


      InstallHook(hwndDlg);
      SetWindowLong(hwndDlg, GWL_EXSTYLE, GetWindowLong(hwndDlg, GWL_EXSTYLE) | WS_EX_LAYERED);
      SetLayeredWindowAttributes(hwndDlg, RGB(0xC0, 0xC0, 0xC0), 0, LWA_COLORKEY);
      DrawWindow(hwndDlg);
      break;
  case WM_PAINT:
  {
      PAINTSTRUCT PaintStruct;
      BeginPaint(hwndDlg, &PaintStruct);
      EndPaint(hwndDlg, &PaintStruct);
  }
  case WM_ACTIVATE:
  case WM_NCACTIVATE:
  case WM_NCPAINT:
  {
      DrawWindow(hwndDlg);
      return 0;
  }
  case WM_COMMAND:
        DestroyWindow(WindowHandle);
      break;

  case WM_LBUTTONUP:
      if(Draging)
      {
        Draging = false;
        ReleaseCapture();
      }
      break;
  case WM_MOUSEMOVE:
      if(Draging)
      {
        POINT P = {LOWORD(lParam), HIWORD(lParam)};
        P.x -= DragX;
        P.y -= DragY;
        ClientToScreen(hwndDlg, &P);
        MoveWindow(hwndDlg, P.x, P.y, 100, 150, TRUE);
      }
      break;
  case WM_LBUTTONDOWN:
      if(HIWORD(lParam) < 63)
      {
        CurrentImage = RightImage;
        DrawWindow(hwndDlg);
        State = WAIT_DOWN;
      }
      else
      {
        DragX = LOWORD(lParam);
        DragY = HIWORD(lParam);
        Draging = true;
        SetCapture(hwndDlg);
      }
      break;
  }
  return DefWindowProc(hwndDlg, msg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, INT nCmdShow)
{
  InstanceHandle = hInstance;

  RightImage = LoadImage(0, "hoejre.bmp", IMAGE_BITMAP, 100, 150, LR_LOADFROMFILE);
  LeftImage = LoadImage(0, "left.bmp", IMAGE_BITMAP, 100, 150, LR_LOADFROMFILE);
  CurrentImage = LeftImage;

  WNDCLASS wc;
  memset(&wc, 0, sizeof(WNDCLASS));
  wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
  wc.lpfnWndProc = DialogProc;
  wc.hInstance = InstanceHandle;
  wc.hbrBackground = (HBRUSH )(COLOR_BTNFACE + 1);
  wc.lpszClassName = "WhateverClass";
  wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  if(!RegisterClass(&wc))
      return FALSE;

  WindowHandle = CreateWindow("WhateverClass",
                              "",
                              WS_VISIBLE,
                              300, 100, 150, 100,
                              NULL,
                              NULL,
                              InstanceHandle,
                              0);
  SetWindowLong(WindowHandle, GWL_STYLE, GetWindowLong(WindowHandle, GWL_STYLE) & ~(WS_CAPTION | WS_SYSMENU | WS_BORDER));

  MSG Msg;
  while(Running && GetMessage(&Msg, WindowHandle, 0, 0xFFFF) > 0)
  {
      if(!IsDialogMessage(WindowHandle, &Msg))
      {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
      }
  }
  return 0;
}
Avatar billede mummikiks Nybegynder
15. februar 2006 - 22:58 #55
Puha nu er det ved at ligne noget. Har to sidste problemer. Jeg bruger knappen til som en lukknappe, som du nok kan se udfra koden, men jeg sætter et rundt baggrundbillede ind (bare et kryds). Jeg kan godt lide knappe effekten, men kan ikke lide at baggrunden på mit billede er en knap. Vi ldet være avanceret at lave det således at knappen var rund og passede til mit runde billede?

Jeg har lidt problemer med applikatoinen. Når jeg bevæger den hurtigt rundt med musen, forsvinder den bare.
Noget forslag
Avatar billede bertelbrander Novice
15. februar 2006 - 23:46 #56
Med hensyn til knappen: Man kan ikke lave en bitmap der er rund og bruge den som knap.
Du kan lave en firkant med samme farve som baggrunden, og lave en rund knap på den.
Eller fange WM_CTLCOLORBTN og tegne knappen der.

Jeg har oplevet en enkelt gang at den forsvinder når man bevæger den rundt.
Jeg vil foreslå at du checker om x og y er større end 0 og mindre en skærmens størrelse inden du flytter den. Du kan bruge GetSystemMetrics til at finde ud af hvor stor skærmen er.
Avatar billede mummikiks Nybegynder
29. august 2006 - 21:19 #57
Lukker..Tak for hjælpen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester