首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

windows窗口和子窗口消息传递的有关问题

2012-01-19 
windows窗口和子窗口消息传递的问题下面的代码一部分时Dev-C++自己生成的,一部分是从教程copy的,我想问的

windows窗口和子窗口消息传递的问题
下面的代码一部分时Dev-C++自己生成的,一部分是从教程copy的,我想问的是在WM_COMMAND消息里怎样区分一个消息是从哪个按钮传递的,谢谢了

C/C++ code
#include <windows.h>struct{                   int                   iStyle ;                   TCHAR *               szText ;        }button[] =        {                   BS_PUSHBUTTON,        TEXT ("PUSHBUTTON"),                   BS_DEFPUSHBUTTON,     TEXT ("DEFPUSHBUTTON"),                   BS_CHECKBOX,          TEXT ("CHECKBOX"),                   BS_AUTOCHECKBOX,         TEXT ("AUTOCHECKBOX"),                   BS_RADIOBUTTON,       TEXT ("RADIOBUTTON"),                   BS_3STATE,            TEXT ("3STATE"),                   BS_AUTO3STATE,        TEXT ("AUTO3STATE"),                   BS_GROUPBOX,          TEXT ("GROUPBOX"),                   BS_AUTORADIOBUTTON,      TEXT ("AUTORADIO"),                   BS_OWNERDRAW,            TEXT ("OWNERDRAW")        } ;        #define NUM (sizeof button / sizeof button[0])/*  Declare Windows procedure  */LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);/*  Make the class name into a global variable  */char szClassName[ ] = "My firest window form application";int WINAPI WinMain (HINSTANCE hThisInstance,                    HINSTANCE hPrevInstance,                    LPSTR lpszArgument,                    int nFunsterStil){    HWND hwnd;               /* This is the handle for our window */    MSG messages;            /* Here messages to the application are saved */    WNDCLASSEX wincl;        /* Data structure for the windowclass */    /* The Window structure */    wincl.hInstance = hThisInstance;    wincl.lpszClassName = szClassName;    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */    wincl.cbSize = sizeof (WNDCLASSEX);    /* Use default icon and mouse-pointer */    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);    wincl.lpszMenuName = NULL;                 /* No menu */    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */    wincl.cbWndExtra = 0;                      /* structure or the window instance */    /* Use Windows's default color as the background of the window */    HBRUSH br = CreateSolidBrush(RGB(255,255,255));    wincl.hbrBackground = br;   // wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;    /* Register the window class, and if it fails quit the program */    if (!RegisterClassEx (&wincl))        return 0;    /* The class is registered, let's create the program*/    hwnd = CreateWindowEx (           0,                   /* Extended possibilites for variation */           szClassName,         /* Classname */           "My firest windows form application",       /* Title Text */           WS_OVERLAPPEDWINDOW, /* default window */           CW_USEDEFAULT,       /* Windows decides the position */           CW_USEDEFAULT,       /* where the window ends up on the screen */           800,                 /* The programs width */           600,                 /* and height in pixels */           HWND_DESKTOP,        /* The window is a child-window to desktop */           NULL,                /* No menu */           hThisInstance,       /* Program Instance handler */           NULL                 /* No Window Creation data */           );    /* Make the window visible on the screen */    ShowWindow (hwnd, nFunsterStil);    /* Run the message loop. It will run until GetMessage() returns 0 */    while (GetMessage (&messages, NULL, 0, 0))    {        /* Translate virtual-key messages into character messages */        TranslateMessage(&messages);        /* Send message to WindowProcedure */        DispatchMessage(&messages);    }    /* The program return-value is 0 - The value that PostQuitMessage() gave */    return messages.wParam;}/*  This function is called by the Windows function DispatchMessage()  */LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){            static int iCount;       static HWND  hwndButton[NUM] ;       static RECT  rect ;       static TCHAR  szTop[] = TEXT ("message   wParam  lParam"),       szUnd[] = TEXT ("_______   ______  ______"),       szFormat[] = TEXT ("%-16s%04X-%04X   %04X-%04X"),       szBuffer[50] ;       static int cxChar, cyChar ;       int i;    char *p;    p = "abckefsdf";    HDC hdc;    PAINTSTRUCT ps;    switch (message)                  /* handle the messages */    {  case  WM_CREATE :              cxChar = LOWORD (GetDialogBaseUnits ()) ;              cyChar = HIWORD (GetDialogBaseUnits ()) ;              for (i = 0 ; i < NUM ; i++)                    hwndButton[i] =CreateWindow ( TEXT("button"),button[i].szText,                    WS_CHILD | WS_VISIBLE | button[i].iStyle,                    cxChar, cyChar * (1 + 2 * i),  20 * cxChar, 7 * cyChar / 4,hwnd, (HMENU) i,                    ((LPCREATESTRUCT) lParam)->hInstance, NULL) ;              return 0 ;        case WM_DESTROY:            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */            break;        case WM_PAINT:                InvalidateRect (hwnd, &rect, TRUE) ;                hdc = BeginPaint (hwnd, &ps) ;                            TextOut(hdc,50,100,"刘备",0);                TextOut(hdc,50,100,TEXT("xxy"),0);                SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;                SetBkMode (hdc, TRANSPARENT) ;                TextOut (hdc, 24 * cxChar, cyChar, szTop, lstrlen (szTop)) ;                TextOut (hdc, 24 * cxChar, cyChar, szUnd, lstrlen (szUnd)) ;                EndPaint (hwnd, &ps) ;                return 0 ;        case WM_LBUTTONDOWN:            iCount = 0;            InvalidateRect(hwnd,NULL,TRUE);            TextOut(hdc,50,100,"刘备",0);            break;        case WM_RBUTTONDOWN:            break;        case WM_SIZE:            rect.left = 24 * cxChar ;            rect.top =  2 * cyChar ;            rect.right = LOWORD (lParam) ;            rect.bottom = HIWORD (lParam) ;            return 0 ;        case WM_COMMAND :               ScrollWindow (hwnd, 0, -cyChar, &rect, &rect) ;            hdc = GetDC (hwnd) ;            SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;            TextOut(hdc, 24 * cxChar, cyChar * (rect.bottom / cyChar - 1),szBuffer,wsprintf (szBuffer, szFormat,                    message == WM_DRAWITEM ? TEXT ("WM_DRAWITEM") :TEXT ("WM_COMMAND"),                    HIWORD (wParam), LOWORD (wParam),                    HIWORD (lParam), LOWORD (lParam))) ;            ReleaseDC (hwnd, hdc) ;            ValidateRect (hwnd, &rect) ;           break ;        default:                      /* for messages that we don't deal with */                return DefWindowProc (hwnd, message, wParam, lParam);    }    return 0;} 



[解决办法]

LOWORD(wParam);//通过按钮的ID来判断

热点排行