Avatar billede vakseviggo Nybegynder
02. maj 2001 - 11:01 Der er 6 kommentarer

knapper med ICON samt TEKST..

skal man lave dem gå i ownerdraw mode for at det er muligt at lave..??

Avatar billede joha Nybegynder
06. maj 2001 - 20:48 #1
Du behøver ikke men det er klart det nemmeste. Du kan evt. også subclasse kanppen, men det er ofte besværligt at få til at virke.

Den sidste mulighed, som jeg kan huske, er at lave sit egen control (custom control), som du tegner og lader reagagere som en kanp. (Dette brugte jeg bla. i tidernes morgen til at lave hover-buttons i Win95)

~joha~
Avatar billede vakseviggo Nybegynder
07. maj 2001 - 21:24 #2
joha >> hvordan subclasser du knappen ??

joha >> hvordan laver du en sådan \"custom control\" ??
Avatar billede joha Nybegynder
08. maj 2001 - 11:11 #3
Bruger du MFC eller programmere direkte i API´en?

Hvis du bruger MFC er løsningen ret simpel, da MFC alllerede subclasser sine controls.
Alt du skal gøre er at skrive message-handlers, til de messages du vil behandle. Hvis du vil tegne vinduet, skal bruge ON_WM_PAINT() -> OnPaint() osv. Husk at kalde base-class´en på det rette tidspunkt ellers vil knappen opføre sig sjovt!

En custom control er bare et vindue som du selv registrere via funktionerne RegisterClass() (API) eller AfxRegisterClass() (MFC), og derefter skriver message-handler´ne.

Håber det hjalp en smule...
~joha~
Avatar billede vakseviggo Nybegynder
09. maj 2001 - 09:44 #4
jeg programmerer i REN win32 API...
Avatar billede joha Nybegynder
09. maj 2001 - 14:41 #5
Det er jo cool.., Jeg fortrækker også ofte API´en.

For at subclasse gør du:

// Global variabel:
WNDPROC g_oldWndProc;

//---------------------------
// Efter du har lavet vinduet, skal du subclasse:

// Få fat i den orginale wndproc:
g_oldWndProc = (WNDPROC) GetWindowLong(hWndButton, GWL_WNDPROC);

// Udskift med din egen:
SetWindoLong(hWndButton, GWL_WNDPROC, MyWndProc);

//--------------------
// Før parent bliver destroy´et:

// Skift tilbage til den gamle wndproc:
SetWindowLong(hWndEdit, GWL_WNDPROC, g_oldWndProc);


// The custom wndproc:
LRESULT CALLBACK MyWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  switch (message)
  {
    // DO WORK:
 
    case WM_DESTROY:
      SetWindowLong(hWnd, GWL_WNDPROC, oldWndProc);
      break;
  }

  // Husk at kalde den originale WndProc...
  return CallWindowProc(g_oldWndProc, hWnd, message, wParam, lParam);
}


Husk at define STRICT, før du includer <windows.h>
ellers kender compileren ikke WNDPROC!
Avatar billede joha Nybegynder
09. maj 2001 - 14:45 #6
Ups...

\"case WM_DESTROY:
      SetWindowLong(hWnd, GWL_WNDPROC, oldWndProc);
      break;\"

er en \"tyrk\" fejl. Det skal slet ikke bruges...

Sorry
~joha~

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