子窗口控件——按钮类别

来源:互联网 发布:mysql 子查询 临时表 编辑:程序博客网 时间:2024/05/16 05:31
每个子窗口控件都具有一个在其兄弟中唯一的窗口代号和ID值。
id = GetWindowLong (hwndChild, GWL_ID) ;
id = GetDlgCtrlID (hwndChild) ;
 hwndChild = GetDlgItem (hwndParent, id) ;


    当按钮的高度为文字字符高度的7/4倍时,按钮的外观看起来最好,其中文字字符由BTNLOOK使用;而按钮的宽度至少调节到文字的宽度再加上两个字符的宽度。

   

按键: 按键控件主要用来触发一个立即响应的动作,而不保留任何形式的开/关指示。

          eg:BS_PUSHBUTTON和BS_DEFPUSHBUTTON,BS_DEFPUSHBUTTON中的“DEF”代表“内定”。

复选框:  复选框是一个文字方块,文字通常出现在复选框的右边(如果您在建立按钮时指定了BS_LEFTTEXT样式,                 那么文字会出现在左边;您也许将用BS_RIGHT直接调整文字来组合此样式)。复选框通常用于允许使用者               对选项进行选择的应用程序中。复选框的常用功能如同一个开关:单击框一次将显示勾选标记,再次单击清               除勾选标记.(机长时间记录一个状态!)

              e.g.: BS_CHECKBOX和BS_AUTOCHECKBOX。

单选按钮: 在对话框中,单选按钮组常常用来表示相互排斥的选项。与复选框不同,单选按钮的工作与开关不一样,                 也就是说,当第二次按单选按钮时,它的状态会保持不变。

              e.g: 单选按钮有窗口样式BS_RADIOBUTTON或BS_AUTORADIOBUTTON两种,但是后者只用于对话框。


SendMessage (hwndButton, BM_SETCHECK, 1, 0) ;  表示选中。Auto的会自动选中。

SendMessage (hwndButton, BM_SETCHECK, 0, 0) ;  未选中。



改变按钮文字:

    SetWindowText (hwnd, pszString) ;对于一般的窗口来说,这个文字是标题列的文字;对于按钮控件来说,它是随       着该按钮显示的文字。

 取得窗口目前的文字:    iLength = GetWindowText (hwnd, pszBuffer, iMaxLength) ;

                                         iLength = GetWindowTextLength (hwnd) ;


Windows的字符串函数

正如前面谈到的,Microsoft C包括宽字符和需要字符串参数的C语言运行时期链接库函数的所有普通版本。不过,Windows复制了其中一部分。例如,下面是Windows定义的一组字符串函数,这些函数用来计算字符串长度、复制字符串、连接字符串和比较字符串:

ILength = lstrlen (pString) ;pString = lstrcpy (pString1, pString2) ;pString = lstrcpyn (pString1, pString2, iCount) ;pString = lstrcat (pString1, pString2) ;iComp = lstrcmp (pString1, pString2) ;iComp = lstrcmpi (pString1, pString2) ;

理解父亲向子 和 子向父传递消息的形式~!!!

子窗口向父窗口发消息:

当您运行BTNLOOK时,将看到在显示区域的左边会显示出不同的按钮型态。我在前面已经提到过,用鼠标单击按钮时,子窗口控件就向其父窗口发送一个WM_COMMAND消息。BTNLOOK拦截WM_COMMAND消息并显示wParam和lParam的值,它们的含义如下:

LOWORD (wParam)

HIWORD (wParam)

lParam

子窗口ID

通知码

子窗口代号


父窗口向子窗口发送消息

 父窗口消息处理程序也能向子窗口控件发送消息。这些消息包括以前缀WM开头的许多消息。另外,在WINUSER.H中还定义了8个按钮说明消息;前缀BM表示“按钮消息”。这些按钮消息如下表所示:

表9-2
按钮消息BM_GETCHECK0x00F0BM_SETCHECK0x00F1BM_GETSTATE0x00F2BM_SETSTATE0x00F3BM_SETSTYLE0x00F4BM_CLICK0x00F5BM_GETIMAGE0x00F6BM_SETIMAGE0x00F7

BM_GETCHECK和BM_SETCHECK消息由父窗口发送给子窗口控件,以取得或者设定复选框和单选按钮的选中标记。

SendMessage (hwndButton, BM_SETCHECK, 1, 0) ;  表示选中。Auto的会自动选中。

SendMessage (hwndButton, BM_SETCHECK, 0, 0) ;  未选中。

BM_GETSTATE和BM_SETSTATE消息表示按钮处于正常状态还是(鼠标或Spacebar键按下时的)“按下”状态。我们将在讨论按钮的每种型态时,看到这些消息是如何起作用的。BM_SETSTYLE消息允许您在按钮建立之后改变按钮样式。

可是试验后发现都可以通用!!!不知道有什么区别?http://msdn.microsoft.com/zh-cn/magazine/bb775943(en-us,VS.85).aspx  这个说的明白!


可见的和启用的按钮:

当窗口是可见的而未被启用时,那么窗口将以灰色而非黑色显示文字。

                           for(i = 0; i<NUM; i++)
   if(IsWindowVisible(hwndButton[i])) ShowWindow(hwndButton[i], SW_HIDE);
    else  ShowWindow(hwndButton[i], SW_SHOWNORMAL);
          for(i = 0; i<NUM; i++)
if(IsWindowEnabled(hwndButton[i])) EnableWindow(hwndButton[i],FALSE);
else EnableWindow(hwndButton[i],TRUE);


按钮和输入焦点

我在本章前面已经提到过,当用鼠标单击按钮、复选框、单选框和拥有者绘制按钮时,它们接收到输入焦点。这些控件使用文字周围的虚线来表示它拥有了输入焦点。当子窗口控件得到输入焦点时,其父窗口就失去了输入焦点;所有的键盘输入都进入子窗口控件,而不会进入父窗口中。但是,子窗口控件只对Spacebar键作出回应,此时Spacebar键的作用就如同鼠标按键一样。这种情形导致了一个明显的问题:您的程序失去了对键盘处理的控件。!!!


[cpp] view plaincopy
  1. /*-------------------------------------------------------------------------- 
  2.     BTNLOOK.C --    Button Look Program 
  3.                             (c) Charles Petzold, 1998 
  4. ---------------------------------------------------------------------------*/  
  5.   
  6. #include <windows.h>  
  7. #include<windowsx.h>  
  8. struct  
  9. {  
  10.         int             iStyle ;  
  11.         TCHAR *         szText ;  
  12. }  
  13. button[] =  
  14. {  
  15.         BS_PUSHBUTTON,           TEXT ("PUSHBUTTON"),  
  16.         BS_DEFPUSHBUTTON,        TEXT ("DEFPUSHBUTTON"),  
  17.         BS_CHECKBOX,             TEXT ("CHECKBOX"),  
  18.         BS_AUTOCHECKBOX,         TEXT ("AUTOCHECKBOX"),  
  19.         BS_RADIOBUTTON,          TEXT ("RADIOBUTTON"),  
  20.         BS_3STATE,               TEXT ("3STATE"),  
  21.         BS_AUTO3STATE,           TEXT ("AUTO3STATE"),  
  22.         BS_GROUPBOX,             TEXT ("GROUPBOX"),  
  23.         BS_AUTORADIOBUTTON,      TEXT ("AUTORADIO"),  
  24.         BS_OWNERDRAW,            TEXT ("OWNERDRAW")  
  25. } ;  
  26.   
  27. #define NUM (sizeof button / sizeof button[0])  
  28. LRESULT CALLBACK WndProc (HWNDUINTWPARAMLPARAM) ;  
  29. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,  
  30.                                             PSTR szCmdLine, int iCmdShow)  
  31. {  
  32.         static TCHAR    szAppName[] = TEXT ("BtnLook") ;  
  33.         HWND                        hwnd ;  
  34.         MSG                         msg ;  
  35.         WNDCLASS            wndclass ;  
  36.   
  37.         wndclass.style                      = CS_HREDRAW | CS_VREDRAW ;  
  38.         wndclass.lpfnWndProc                = WndProc ;  
  39.         wndclass.cbClsExtra                 = 0 ;  
  40.         wndclass.cbWndExtra                 = 0 ;  
  41.         wndclass.hInstance                  = hInstance ;  
  42.         wndclass.hIcon                      = LoadIcon (NULL, IDI_APPLICATION) ;  
  43.         wndclass.hCursor            = LoadCursor (NULL, IDC_ARROW) ;  
  44.         wndclass.hbrBackground      = (HBRUSH) GetStockObject (WHITE_BRUSH) ;  
  45.         wndclass.lpszMenuName       = NULL ;  
  46.         wndclass.lpszClassName      = szAppName ;  
  47.   
  48.         if (!RegisterClass (&wndclass))  
  49.      {  
  50.                 MessageBox (    NULL, TEXT ("This program requires Windows NT!"),  
  51.                                                 szAppName, MB_ICONERROR) ;  
  52.                 return 0 ;  
  53.         }  
  54.   
  55.         hwnd = CreateWindow (   szAppName, TEXT ("Button Look"),  
  56.                                 WS_OVERLAPPEDWINDOW,  
  57.                                 CW_USEDEFAULT, CW_USEDEFAULT,  
  58.                                 CW_USEDEFAULT, CW_USEDEFAULT,  
  59.                                 NULL, NULL, hInstance, NULL) ;  
  60.   
  61.         ShowWindow (hwnd, iCmdShow) ;  
  62.         UpdateWindow (hwnd) ;  
  63.   
  64.         while (GetMessage (&msg, NULL, 0, 0))  
  65.         {  
  66.     TranslateMessage (&msg) ;  
  67.                     DispatchMessage (&msg) ;  
  68.         }  
  69.         return msg.wParam ;  
  70. }  
  71.   
  72. LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)  
  73. {  
  74.         static HWND         hwndButton[NUM] ;  
  75.         static RECT         rect ;  
  76.         static TCHAR        szTop[]     = TEXT ("message   wParam  lParam"),  
  77.                          szUnd[]        = TEXT ("_______   ______  ______"),  
  78.                           szFormat[]    = TEXT ("%-16s%04X-%04X   %04X-%04X"),  
  79.                         szBuffer[50] ;  
  80.         static int          cxChar, cyChar ;  
  81.         HDC                         hdc ;  
  82.         PAINTSTRUCT         ps ;  
  83.         int                         i ;  
  84.         int maxlength;  
  85.   
  86.   
  87.         switch (message)  
  88.         {  
  89.         case    WM_CREATE :  
  90.                 cxChar = LOWORD (GetDialogBaseUnits ()) ;  
  91.                 cyChar = HIWORD (GetDialogBaseUnits ()) ;  
  92.   
  93.                 for (i = 0 ; i < NUM ; i++)  
  94.                     hwndButton[i] = CreateWindow ( TEXT("button"),button[i].szText,  
  95.                                                    WS_CHILD | WS_VISIBLE | button[i].iStyle,  
  96.                                                    cxChar, cyChar * (1 + 2 * i),  
  97.                                                    20 * cxChar, 7 * cyChar / 4,  
  98.                                                    hwnd, (HMENU) i,  
  99.                                                   ((LPCREATESTRUCT) lParam)->hInstance, NULL) ;  
  100.                 return 0 ;  
  101.   
  102.         case    WM_SIZE :  
  103.                 rect.left           = 24 * cxChar ;  
  104.                 rect.top            =  2 * cyChar ;  
  105.                 rect.right          = LOWORD (lParam) ;  
  106.                 rect.bottom         = HIWORD (lParam) ;  
  107.                 return 0 ;  
  108.         case    WM_PAINT :  
  109.                 InvalidateRect (hwnd, &rect, TRUE) ;  
  110.   
  111.                 hdc = BeginPaint (hwnd, &ps) ;  
  112.                 SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;  
  113.                 SetBkMode (hdc, TRANSPARENT) ;  
  114.   
  115.                 TextOut (hdc, 24 * cxChar, cyChar, szTop, lstrlen (szTop)) ;  
  116.                 TextOut (hdc, 24 * cxChar, cyChar, szUnd, lstrlen (szUnd)) ;  
  117.   
  118.                 EndPaint (hwnd, &ps) ;  
  119.                 return 0 ;  
  120.   
  121.          case WM_KEYDOWN:  
  122.             switch(wParam)  
  123.             {  
  124.             case VK_UP:  
  125.                 //SendMessage(hwndButton[2],BM_SETCHECK, 1,  0 );  
  126.                 SendMessage(hwndButton[3],BM_SETCHECK, 1,  0 );//复选,单选按钮  
  127.                 SendMessage(hwndButton[5],BM_SETSTATE, 1, 0);  //按钮  
  128.                 break;  
  129.             case VK_DOWN:  
  130.                 SendMessage(hwndButton[3],BM_SETCHECK, 0, 0);//父向子发送消息  
  131.                 SendMessage(hwndButton[4],BM_SETSTATE,0,0);  
  132.                 break;  
  133.             case VK_RIGHT:  
  134.                 SendMessage(hwndButton[3],BM_SETCHECK,   
  135.                            (WPARAM)!SendMessage(hwndButton[3],BM_GETCHECK,0,0), 0);  
  136.                 break;  
  137.             case VK_HOME:  
  138.                   
  139.                 //for(i = 0; i<NUM; i++)  
  140.                     //if(IsWindowVisible(hwndButton[i])) ShowWindow(hwndButton[i], SW_HIDE);  
  141.                     //else  ShowWindow(hwndButton[i], SW_SHOWNORMAL);  
  142.                 for(i = 0; i<NUM; i++)  
  143.                     if(IsWindowEnabled(hwndButton[i])) EnableWindow(hwndButton[i],FALSE);  
  144.                     else EnableWindow(hwndButton[i],TRUE);  
  145.   
  146.                 break;  
  147.             }  
  148.             hdc = GetDC(hwnd);  
  149.             if(SendMessage(hwndButton[3],BM_GETCHECK,0,0))  
  150.                 TextOut(hdc,0,0,TEXT("TRUE"),4);  
  151.             else   
  152.                 TextOut(hdc,0,0,TEXT("FALSE"),5);  
  153.             DeleteObject(hdc);  
  154.             //InvalidateRect(hwnd, &rect, TRUE);  
  155.             return 0;   
  156.   
  157.         case    WM_DRAWITEM :  
  158.         case    WM_COMMAND :  
  159.                 ScrollWindow (hwnd, 0, -cyChar, &rect, &rect) ;  
  160.   
  161.                 hdc = GetDC (hwnd) ;  
  162.                 SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;  
  163.   
  164.                 TextOut(    hdc, 24 * cxChar, cyChar * (rect.bottom / cyChar - 1),  
  165.                                     szBuffer,  
  166.                                     wsprintf (szBuffer, szFormat,  
  167.                                             message == WM_DRAWITEM ?    TEXT ("WM_DRAWITEM") :  
  168.                                             TEXT ("WM_COMMAND"),  
  169.                                             HIWORD (wParam), LOWORD (wParam),  
  170.                                             HIWORD (lParam), LOWORD (lParam))) ;  
  171.   
  172.                 ReleaseDC (hwnd, hdc) ;  
  173.   
  174.                 if((HWND)lParam == hwndButton[0]){//子向父发送消息  
  175.                     for(i =1; i < NUM; i++){  
  176.                         maxlength = GetWindowText(hwndButton[i], szBuffer, 40);  
  177.                         SetWindowText(hwndButton[i],lstrcat(szBuffer,L"+"));     
  178.                     }  
  179.                 }  
  180.   
  181.                   
  182.                 ValidateRect (hwnd, &rect) ;  
  183.                 break ;  
  184.         /*case WM_KILLFOCUS://系统给正在失去输入焦点的窗口发送一个WM_KILLFOCUS消息 
  185.                           //wParam参数是接收输入焦点的窗口的代号。 
  186.               if(hwnd == GetParent((HWND)wParam)) 
  187.                   SetFocus(hwnd); 
  188.  
  189.               /*等价于 
  190.                     for(i = 0; i<NUM; i++){  
  191.                         if(hwndButton[i] == (HWND) wParam){ 
  192.                             SetFocus(hwnd); 
  193.                             break; 
  194.                         } 
  195.                     } 
  196.               */  
  197.                   
  198.               return 0;  
  199.         case    WM_DESTROY :  
  200.                 PostQuitMessage (0) ;  
  201.                 return 0 ;  
  202.      }  
  203.         return DefWindowProc (hwnd, message, wParam, lParam) ;  
  204. }  
原创粉丝点击