C语言网

 找回密码
 加入社区!

QQ登录

只需一步,快速开始

查看: 256|回复: 3

[C语言] Windows_Program_Via_C_控件的使用 [复制链接]

Rank: 6Rank: 6

主题
72
帖子
361
C币
652 枚
在线时间
62 小时
发表于 2011-9-4 13:40:15 |显示全部楼层
分享到:
  1. /*
  2.   子窗口控件实例程序

  3. ——按钮
  4. */

  5. #include <windows.h>
  6. #include <winuser.h>
  7. #include <wingdi.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("GROPBOX"),
  23.         BS_AUTORADIOBUTTON,TEXT("AUTORADIOBUTTON"),
  24.         BS_OWNERDRAW,TEXT("OWNERDRAW")
  25. };

  26. #define NUM (sizeof button/ sizeof button[0])

  27. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM,LPARAM);

  28. int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
  29. {
  30.         static TCHAR szAppClassName[]=TEXT("BtnLook");
  31.         static TCHAR szAppCaption[]=TEXT("BUTTON LOOK");
  32.         HWND  hwnd;
  33.         MSG  msg;
  34.         WNDCLASS wndclass;
  35.         HBRUSH hBrush;

  36.         hBrush=CreateSolidBrush(RGB(100,200,40));
  37.     /*
  38.         WINGDIAPI HBRUSH  WINAPI CreateSolidBrush(COLORREF);                  
  39.         函数功能:
  40.                  该函数创建一个具有指定颜色的逻辑刷子。
  41.   函数原型:
  42.             HBRUSH CreateSolidBrush(COLORREF crColor);
  43.   参数:
  44.           crColor:指定刷子的颜色。
  45.   返回值:
  46.             如果该函数执行成功,那么返回值标识一个逻辑实心刷子;如果函数失败,那么返回值为NULL。
  47.   Windows NT:
  48.             若想获得更多错误信息,请调用GetLastError函数。
  49.   备注:
  50.           实心刷子实际上就是指系统用来绘制要填充图形的内部区域的位图。
  51.         在应用程序调用CreateSolidBrush创建刷子以后,可以通过调用SelectObject函数把该刷子选入设备环境。
  52.   ICM:
  53.           在创建刷子时没有颜色操作。 然而,当把该刷子选入ICM许可的设备环境中时,将进行颜色管理。   
  54.         */
  55.         wndclass.cbClsExtra=0;
  56.         wndclass.cbWndExtra=0;
  57.         wndclass.hbrBackground=hBrush;
  58.         wndclass.hCursor=LoadCursor(NULL,IDC_CROSS);
  59.         wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
  60.         wndclass.hInstance=hInstance;
  61.         wndclass.lpfnWndProc=WndProc;
  62.         wndclass.lpszClassName=szAppClassName;
  63.         wndclass.lpszMenuName=NULL;
  64.         wndclass.style=CS_VREDRAW |CS_HREDRAW;

  65.         if(!RegisterClass(&wndclass))
  66.         {
  67.                 MessageBox(NULL,"You need WinNT to run this program!","Warning",MB_OK);
  68.                 return 0;
  69.         }

  70.         hwnd=CreateWindow(szAppClassName,
  71.                               szAppCaption,
  72.                                           WS_OVERLAPPEDWINDOW,
  73.                                           CW_USEDEFAULT,
  74.                                           CW_USEDEFAULT,
  75.                                           CW_USEDEFAULT,
  76.                                           CW_USEDEFAULT,
  77.                                           NULL,
  78.                                           NULL,
  79.                                           hInstance,
  80.                                           NULL);

  81.         ShowWindow(hwnd,nShowCmd);
  82.         UpdateWindow(hwnd);

  83.         while(GetMessage(&msg,NULL,0,0))
  84.         {
  85.                 TranslateMessage(&msg);
  86.                 DispatchMessage(&msg);
  87.         }
  88.         return msg.wParam;                                
  89. }

  90. LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam, LPARAM lParam)
  91. {
  92.     static HWND hwndButton[NUM];
  93.     static RECT rect;
  94.         static TCHAR szTop[]=TEXT("MESSAGE         wParam     lParam"),
  95.                          szUnd[]=TEXT("_______         ______     ______"),
  96.                                  szFormat[]=TEXT("%-16s%04X-%04X  %04X-%04X"),
  97.                                  szBuffer[50];
  98.         static int cxChar,cyChar;
  99.         HDC hdc;
  100.         PAINTSTRUCT ps;
  101.         int i;
  102.         static BOOL fCheckBox=FALSE;

  103.         switch(message)
  104.         {
  105.         case WM_CREATE:
  106.              cxChar=LOWORD(GetDialogBaseUnits());
  107.          /*
  108.                  GetDialogBaseUnits(void);
  109.                  函数功能:
  110.                            是对话框用来获取文字尺寸的函数,此函数返回一个32位的值,
  111.                                    低字表示字体的宽度
  112.                                    高字表示字体的高度
  113.                    GetDialogBaseUnits传回的值与GetTextMetrics获取的值大致相同
  114.                  相比来说在对话框中,用GetDialogBaseUnits函数与对话框控件更好的保持一致
  115.                  */
  116.                  cyChar=HIWORD(GetDialogBaseUnits());
  117.                  for(i=0;i<NUM;i++)
  118.                     hwndButton[i]=CreateWindow(TEXT("button"),
  119.                                                    button[i].szText,
  120.                                                                            WS_CHILD |WS_VISIBLE | button[i].iStyle, //|BS_NOTIFY,
  121.                                                                            cxChar,
  122.                                                                            cyChar*(1+2*i),
  123.                                                                            20*cxChar,
  124.                                                                            7*cyChar/4,
  125.                                                                            hwnd,
  126.                                                                            (HMENU)i,
  127.                                                                            //(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),  
  128.                                                                            ((LPCREATESTRUCT)lParam)->hInstance,
  129.                 /*
  130.                 在处理WM_CREATE消息时,lParam参数实际指向的是CREATESTRUCT(建立结构)结构的指针,
  131.                 该结构有一个hInstance成员,将lParam转换为LPCREATESTRUCT结构,使用其成员hInstance。

  132.         函数
  133.                      WINUSERAPI LONG WINAPI  GetWindowLongA(HWND hWnd,int nIndex);
  134.                      #define GetWindowLong GetWindowLoangA
  135.          获取窗口的信息
  136.                
  137.                 */
  138.                                                                            NULL);
  139.                  return 0;
  140.         case WM_SIZE:
  141.                 rect.left=24*cxChar;
  142.                 rect.top =2*cyChar;
  143.                 rect.right =LOWORD(lParam);
  144.                 rect.bottom =HIWORD(lParam);
  145.                 return 0;
  146.         case WM_PAINT:
  147.                 InvalidateRect(hwnd,&rect,TRUE);
  148.                 hdc=BeginPaint(hwnd,&ps);
  149.                 SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));
  150.                 SetBkMode(hdc,TRANSPARENT);
  151.                 TextOut(hdc,12*cyChar,cyChar,szTop,lstrlen(szTop));
  152.                 TextOut(hdc,24*cxChar,cyChar,szUnd,lstrlen(szUnd));
  153.                 EndPaint(hwnd,&ps);
  154.                 return 0;
  155.         case WM_DRAWITEM:
  156.         case WM_COMMAND:
  157.                 ScrollWindow(hwnd,0,-cyChar,&rect,&rect);
  158.                 hdc=GetDC(hwnd);
  159.                 SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));
  160.                 TextOut(hdc,
  161.                             24*cxChar,
  162.                                 cyChar*(rect.bottom/cyChar-1),
  163.                                 szBuffer,
  164.                             wsprintf(szBuffer,
  165.                                      szFormat,
  166.                                              message==WM_DRAWITEM ?TEXT("WM_DRAWITEM"):TEXT("WM_COMMAND"),
  167.                                              HIWORD(wParam),
  168.                                              LOWORD(wParam),
  169.                                              HIWORD(lParam),
  170.                                              LOWORD(lParam) ) );
  171.                 ReleaseDC(hwnd,hdc);
  172.                 ValidateRect(hwnd,&rect);

  173.         /*分组方块的使用,分组方块即BS_GROUPBOX的复选框,是按钮内中的特例,不处理鼠标和键盘输入
  174.           也不会向父窗口发送wm_command消息。
  175.           可以通过SetWindowText函数改变分组方块的文字
  176.                   例如:
  177.                        SetWindowText(hwnd,pszString);  hwnd为要改变文字的按钮句柄,而pszString是需要显示的文字
  178.         */
  179.                 SetWindowText(hwnd,"尝试改变窗口的Caption");
  180.                 SetWindowText(GetDlgItem(hwnd,7),"Test text setting");
  181.         
  182.                 /*同样通过API函数可以获取窗口的目前的Caption文字
  183.              例如:
  184.                        iLength=GetWindowText(hwnd,pszBuffer,iMaxLength);
  185.                         其中:
  186.                               pszBuffer是用来存储取得的caption的文字的存储空间
  187.                               iMaxLength指定要复制的字符长度,
  188.                   同样可以通过函数获取窗口caption字符串的长度
  189.                   即:
  190.                        GetWindowTextLength(hwnd);
  191.                 */
  192.                 //例如
  193.                 if(LOWORD(wParam)==0)
  194.                 {
  195.                     char pszString[100];
  196.                         GetWindowText(hwnd,pszString,GetWindowTextLength(hwnd));
  197.                         MessageBox(hwnd,pszString,"Test",MB_OK);
  198.                 }
  199.                  

  200.                 switch(LOWORD(wParam))
  201.                 {
  202.                 /*
  203.                 这里程序段指示,当窗口接收到子窗口控件(如按钮)的消息时,其wParam、lParam参数
  204.                 会接收到附带的信息,通过这些附带的信息可以用来处理不同的子窗口控件的事件
  205.                 */
  206.                 /*
  207.                 LOWORD(wParam): 传递的是子窗口的ID号,这个号是在调用CreateWindow函数是由用户指定的
  208.         HIWORD(wParam): 传递的是子窗口控件的通知码,通知码进一步描述消息的含义
  209.                 通知码有以下定义:
  210.                    BN_CLICKED: 0
  211.                    BN_PAINT: 1
  212.                    BN_HILITE or BN_PUSHED: 2
  213.                    BN_UNHILITE 、BN_UNPUSHED: 3
  214.                    BN_DISABLE:4
  215.                    BN_DBLCLK  BN_DOUBLECLICKED:5
  216.                    BN_SETFOCUS:6   
  217.                    BN_KILLFOCUS:7
  218.                 通知码6到7,仅在按钮样式包括BS_NOTIFY时才发送
  219.                 */
  220.                 case 0:
  221.                         switch(HIWORD(wParam))
  222.                         {
  223.                         case BN_CLICKED:
  224.                              MessageBox(hwnd,"You have click PUSHBUTTON","Infomation",MB_OK);
  225.                              break;
  226.                         case BN_PAINT:
  227.                                  MessageBox(hwnd,"BN_PAINT","Infomation",MB_OK);
  228.                                  break;
  229.                         case BN_HILITE:
  230.                                  MessageBox(hwnd,"BN_HILITE  OR  BN_PUSHED","Infomation",MB_OK);
  231.                                  break;
  232.                         case BN_UNHILITE:
  233.                                  MessageBox(hwnd,"BN_UNHILITE  OR  BN_UNPUSHED","Infomation",MB_OK);
  234.                                  break;
  235.                         case BN_DISABLE:
  236.                                  MessageBox(hwnd,"BN_DISABLED","Infomation",MB_OK);
  237.                                  break;
  238.                         case BN_SETFOCUS:
  239.                                  MessageBox(hwnd,"BN_SETFOCUS","Infomation",MB_OK);
  240.                                  break;
  241.                         case BN_KILLFOCUS:
  242.                                   MessageBox(hwnd,"BN_KILLFOCUS","Infomation",MB_OK);
  243.                                  break;
  244.                         case BN_DBLCLK:
  245.                                  MessageBox(hwnd,"BN_DBLCLK","Infomation",MB_OK);
  246.                                  break;
  247.                         }
  248.                 case 2:
  249.                         /*
  250.                         这里处理ID号=2 即处理CHECKBOX按钮事件
  251.                         当我们使用SendMessage函数发送BM_SETCHECK消息时,
  252.                         如果附加的:
  253.                                    wParam =0 则表示按钮显示没有被选中
  254.                                    wParam =1 则表示按钮显示被选中                                               
  255.                         */
  256.                         /*
  257.                         这里使用了一个GetDlgItem函数;虽然这个函数是用Dlg标识的,用于对话框的函数,
  258.                         但是这个函数具有通用性,
  259.                         WINUSERAPI HWND WINAPI GetDlgItem(HWND hDlg,int nIDDlgItem);
  260.                         这里hDlg表示的是父窗口的句柄, nIDDlgItem表示是对话框中各个元素的ID号;
  261.                         因此可以:
  262.                               GetDlgItem(hwnd,2)  、
  263.                               hwnd这里表示是窗口的句柄,而2表示窗口中ID=2 的子窗口控件
  264.                         */
  265.                         /*
  266.                         通过对BN_SETCHECK
  267.                               BN_SETSTATE
  268.                         进行比较,当用BN_SETCHECK和1 进行设定时,复选框按钮会显示一个选中的“勾好”
  269.                                   当用BN_SETSTATE和1 进行设定时,复选框按钮会显示为灰色不可用
  270.                         */
  271.                         if(!fCheckBox)
  272.                         {
  273.                            SendMessage(GetDlgItem(hwnd,2),BM_SETCHECK,1,0);
  274.                        fCheckBox=!fCheckBox;
  275.                         }
  276.                         else
  277.                         {  
  278.                            //从这里可以看出hwndButton[2]的值与GetDlgItem(hwnd,2)是相同的
  279.                            SendMessage(hwndButton[2],BM_SETCHECK,0,0);
  280.                        fCheckBox=!fCheckBox;
  281.                         }
  282.                         break;
  283.                 case 3:
  284.                         /*
  285.                         当用BM_SETSTYLE和BS_LEFTTEXT/BS_RIGHT都会使按钮编程下凹的控件样式,并且复选框消失
  286.                         */
  287.                         //SendMessage(GetDlgItem(hwnd,3),BM_SETSTYLE,BS_RIGHT,0);
  288.                         /*
  289.                         我们不但可以使用SendMessage函数发送消息改变按钮的状态,还可以通过SendMessage函数获取
  290.                         复选框按钮的选中状态
  291.                         */
  292.                         if(SendMessage((HWND)lParam,BM_GETCHECK,0,0))
  293.                                 MessageBox(hwnd,"The chekbox have been select","infomation",MB_OK);
  294.                         break;
  295.                 case 4:
  296.                         //处理ID=4 的单选按钮
  297.                         if(!SendMessage((HWND)lParam,BM_GETCHECK,0,0))
  298.                                 SendMessage(GetDlgItem(hwnd,4),BM_SETCHECK,1,0);
  299.                         else
  300.               SendMessage(GetDlgItem(hwnd,4),BM_SETCHECK,0,0);
  301.                         break;
  302.                 case 7:
  303.                         /*分组方块的使用,分组方块即BS_GROUPBOX的复选框,是按钮内中的特例,不处理鼠标和键盘输入
  304.              也不会向父窗口发送wm_command消息。
  305.                          可以通过SetWindowText函数改变分组方块的文字
  306.                          例如:
  307.                                SetWindowText(hwnd,pszString);  hwnd为要改变文字的按钮句柄,而pszString是需要显示的文字
  308.             */
  309.                        
  310.                         break;
  311.                 default:
  312.                         break;
  313.                 }
  314.                 return 0;
  315.         case WM_DESTROY:
  316.                 PostQuitMessage(0);
  317.                 return 0;
  318.         }
  319.         return DefWindowProc(hwnd,message,wParam,lParam);

  320. }
复制代码

Rank: 6Rank: 6

主题
72
帖子
361
C币
652 枚
在线时间
62 小时
发表于 2011-9-4 13:41:02 |显示全部楼层
  1. /*
  2.    本实例程序演示Static控件和scroll控件的创建和使用
  3. */

  4. #include <windows.h>
  5. #include <winuser.h>

  6. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
  7. LRESULT CALLBACK ScrollProc(HWND,UINT,WPARAM,LPARAM);

  8. int idFocus;
  9. WNDPROC OldScroll[3];

  10. int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iShowCmd)
  11. {

  12.         TCHAR AppCaption[]=TEXT("Static and scroll control example!");
  13.         TCHAR ClassName[]=TEXT("StaticScroll");
  14.         HWND hwnd;
  15.         MSG msg;
  16.         WNDCLASS wndclass;

  17.         wndclass.cbClsExtra=0;
  18.         wndclass.cbWndExtra=0;
  19.         wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
  20.         wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
  21.         wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
  22.         wndclass.hInstance =hInstance;
  23.         wndclass.lpfnWndProc=WndProc;
  24.         wndclass.lpszClassName=ClassName;
  25.         wndclass.lpszMenuName=NULL;
  26.         wndclass.style=CS_HREDRAW | CS_VREDRAW;

  27.         RegisterClass(&wndclass);

  28.         hwnd=CreateWindow(ClassName,AppCaption,WS_OVERLAPPEDWINDOW|WS_HSCROLL,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);

  29.         ShowWindow(hwnd,iShowCmd);
  30.         UpdateWindow(hwnd);

  31.         while(GetMessage(&msg,NULL,0,0))
  32.         {
  33.                 TranslateMessage(&msg);
  34.                 DispatchMessage(&msg);
  35.         }
  36.     return msg.wParam;
  37. }

  38. LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  39. {
  40.         TCHAR lbCaption[]=TEXT("First Label");   //定义Label控件的显示的文字内容指针
  41.         HINSTANCE hInstance;
  42.         static COLORREF crPrim[3]={RGB(255,0,0),RGB(0,255,0),RGB(0,0,255)};
  43.         static HBRUSH hBrush[3],
  44.                           hBrushStatic;
  45.         static HWND   hScroll[3],
  46.                           hLabel[3],
  47.                           hValue[3],
  48.                           hRect;
  49.         static int color[3],
  50.                        cyChar;
  51.         static RECT rcColor;
  52.         static RECT rcDraw;
  53.         PAINTSTRUCT ps;
  54.         HDC hdc;

  55.         static TCHAR *szColorLabel[]={TEXT("Red"),TEXT("Green"),TEXT("Blue")};
  56.     int i;
  57.         static int        cxClient,
  58.                         cyClient;
  59.         TCHAR szBuffer[10];


  60.         switch(message)
  61.         {
  62.         case WM_CREATE:
  63.                 hInstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
  64. /*
  65. 函数功能:
  66.     该函数获得有关指定窗口的信息,函数也获得在额外窗口内存中指定偏移位地址的32位度整型值
  67. 函数原型:
  68. WINUSERAPI LONG  WINAPI  GetWindowLongA(HWND hWnd,
  69.                                         int nIndex);

  70. WINUSERAPI LONG WINAPI GetWindowLongW(HWND hWnd,
  71.                                       int nIndex);
  72. #ifdef UNICODE
  73. #define GetWindowLong  GetWindowLongW
  74. #else
  75. #define GetWindowLong  GetWindowLongA
  76. #endif // !UNICODE
  77. 函数参数:
  78.     hWnd:窗口句柄及间接给出的窗口所属的窗口类。
  79.     nlndex:指定要获得值的大于等于0的值的偏移量。有效值的范围从0到额外窗口内存空间的字节数一4
  80.                 例如,若指定了12位或多于12位的额外类存储空间,则应设为第三个32位整数的索引位8。要获得任意其他值,
  81.           指定下列值之一:
  82.           GWL_EXSTYLE;获得扩展窗口风格。
  83.           GWL_STYLE:获得窗口风格。
  84.           GWL_WNDPROC:获得窗口过程的地址,或代表窗口过程的地址的句柄。必须使用GWL_WNDPROC函数调用窗口过程。
  85.           GWL_HINSTANCE:获得应用事例的句柄。
  86.           GWL_HWNDPAAENT:如果父窗口存在,获得父窗口句柄。
  87.           GWL_ID:获得窗口标识。
  88.           GWL_USERDATA:获得与窗口有关的32位值。每一个窗口均有一个由创建该窗口的应用程序使用的32位值。
  89.       在hWnd参数标识了一个对话框时也可用下列值:
  90.          DWL_DLGPROC:获得对话框过程的地址,或一个代表对话框过程的地址的句柄。必须使用函数CallWindowProc来调用对话框过程。
  91.          DWL_MSGRESULT:获得在对话框过程中一个消息处理的返回值。
  92.          DWL_USER:获得应用程序私有的额外信息,例如一个句柄或指针。
  93. 返回值:
  94.     如果函数成功,返回值是所需的32位值;如果函数失败,返回值是0。若想获得更多错误信息请调用 GetLastError函数。
  95. */

  96.                 cxClient=GetSystemMetrics(SM_CXSCREEN);
  97.                 cyClient=GetSystemMetrics(SM_CYSCREEN);
  98. /*
  99. GetSystemMetrics函数参数nIndex的定义
  100.       SM_ARRANGE  返回是否预备最小化.
  101.       SM_CLEANBOOT 返回系统启动方式:
  102.            0 正常启动
  103.            1 安全模式启动
  104.            2 网络安全模式启动
  105.       SM_CMOUSEBUTTONS 返回值为系统支持的鼠标键数,返回0,则系统中没有安装鼠标。
  106.       SM_CXBORDER,
  107. SM_CYBORDER 返回以相素值为单位的Windows窗口边框的宽度和高度,如果Windows的为3D形态,则等同于SM_CXEDGE参数
  108. SM_CXCURSOR,
  109. SM_CYCURSOR 返回以相素值为单位的标准光标的宽度和高度
  110. SM_CXDLGFRAME,
  111. SM_CYDLGFRAME 等同与SM_CXFIXEDFRAME and SM_CYFIXEDFRAME
  112. SM_CXDOUBLECLK,
  113. SM_CYDOUBLECLK 以相素值为单位的双击有效的矩形区域
  114. SM_CXEDGE,SM_CYEDGE 以相素值为单位的3D边框的宽度和高度
  115. SM_CXFIXEDFRAME,
  116. SM_CYFIXEDFRAME 围绕具有标题但无法改变尺寸的窗口(通常是一些对话框)的边框的厚度
  117. SM_CXFRAME,SM_CYFRAME 等同于SM_CXSIZEFRAME and SM_CYSIZEFRAME
  118. SM_CXFULLSCREEN,
  119. SM_CYFULLSCREEN 全屏幕窗口的窗口区域的宽度和高度
  120. SM_CXHSCROLL,
  121. SM_CYHSCROLL 水平滚动条的高度和水平滚动条上箭头的宽度
  122. SM_CXHTHUMB 以相素为单位的水平滚动条上的滑动块宽度
  123. SM_CXICON,SM_CYICON 系统缺省的图标的高度和宽度(一般为32*32)
  124. SM_CXICONSPACING,
  125. SM_CYICONSPACING 以大图标方式查看Item时图标之间的间距,这个距离总是大于等于
  126. SM_CXICON and SM_CYICON.
  127. SM_CXMAXIMIZED,
  128. SM_CYMAXIMIZED 处于顶层的最大化窗口的缺省尺寸
  129. SM_CXMAXTRACK,
  130. SM_CYMAXTRACK 具有可改变尺寸边框和标题栏的窗口的缺省最大尺寸,如果窗口大于这个尺寸,窗口是不可移动的。
  131. SM_CXMENUCHECK,
  132. SM_CYMENUCHECK 以相素为单位计算的菜单选中标记位图的尺寸
  133. SM_CXMENUSIZE,
  134. SM_CYMENUSIZE 以相素计算的菜单栏按钮的尺寸
  135. SM_CXMIN,SM_CYMIN 窗口所能达到的最小尺寸
  136. SM_CXMINIMIZED,
  137. SM_CYMINIMIZED 正常的最小化窗口的尺寸
  138. SM_CXMINTRACK,
  139. SM_CYMINTRACK 最小跟踪距离,当使用者拖动窗口移动距离小于这个值,窗口不会移动。
  140. SM_CXSCREEN,
  141. SM_CYSCREEN 以相素为单位计算的屏幕尺寸。
  142. SM_CXSIZE,SM_CYSIZE 以相素计算的标题栏按钮的尺寸
  143. SM_CXSIZEFRAME,
  144. SM_CYSIZEFRAME 围绕可改变大小的窗口的边框的厚度
  145. SM_CXSMICON,
  146. SM_CYSMICON 以相素计算的小图标的尺寸,小图标一般出现在窗口标题栏上。
  147. M_CXVSCROLL,
  148. SM_CYVSCROLL 以相素计算的垂直滚动条的宽度和垂直滚动条上箭头的高度
  149. SM_CYCAPTION 以相素计算的普通窗口标题的高度
  150. SM_CYMENU 以相素计算的单个菜单条的高度
  151. SM_CYSMCAPTION 以相素计算的窗口小标题栏的高度
  152. SM_CYVTHUMB 以相素计算的垂直滚动条中滚动块的高度
  153. SM_DBCSENABLED 如果为TRUE或不为0的值表明系统安装了双字节版本的USER.EXE,为FALSE或0则不是。
  154. SM_DEBUG 如果为TRUE或不为0的值表明系统安装了debug版本的USER.EXE,为FALSE或0则不是。
  155. SM_MENUDROPALIGNMENT 如果为TRUE或不为0的值下拉菜单是右对齐的否则是左对齐的。
  156. SM_MOUSEPRESENT 如果为TRUE或不为0的值则安装了鼠标,否则没有安装。
  157. SM_MOUSEWHEELPRESENT 如果为TRUE或不为0的值则安装了滚轮鼠标,否则没有安装。(Windows NT only)
  158. SM_SWAPBUTTON 如果为TRUE或不为0的值则鼠标左右键交换,否则没有。
  159. */
  160.                 hRect=CreateWindow( TEXT("static"),
  161.                                         TEXT("0"),
  162.                                                         WS_CHILD | WS_VISIBLE | SS_BLACKFRAME,
  163.                                                         0,
  164.                                                         0,
  165.                                                         cxClient/2,
  166.                                                         cyClient,
  167.                                                         hwnd,
  168.                                                         (HMENU)9,
  169.                                                         hInstance,
  170.                                                         NULL);
  171.                 rcDraw.left=0;
  172.                 rcDraw.top=0;
  173.                 rcDraw.right=cxClient/2;
  174.                 rcDraw.bottom=cyClient;
  175.                 for(i=0;i<3;i++)
  176.                 {
  177.                         hScroll[i]=CreateWindow(TEXT("SCROLLBAR"),
  178.                                                     NULL,WS_CHILD|WS_VISIBLE|WS_TABSTOP|SBS_VERT,
  179.                                                                         0,0,0,0,
  180.                                                                         hwnd,
  181.                                                                         (HMENU)i,
  182.                                                                         hInstance,
  183.                                                                         NULL);
  184.                          
  185.                         SetScrollRange(hScroll[i],SB_CTL,0,255,FALSE);
  186.                         SetScrollPos(hScroll[i],SB_CTL,0,FALSE);
  187.                        
  188.                         hLabel[i]=CreateWindow(TEXT("static"),
  189.                                                    szColorLabel[i],
  190.                                                                    WS_CHILD|WS_VISIBLE|SS_CENTER,
  191.                                                                    0,0,0,0,
  192.                                                                    hwnd,
  193.                                                                    (HMENU)(i+3),
  194.                                                                    hInstance,
  195.                                                                    NULL);

  196.                         hValue[i]=CreateWindow(TEXT("static"),
  197.                                                    TEXT("0"),WS_CHILD|WS_VISIBLE|SS_CENTER,
  198.                                                                    0,0,0,0,
  199.                                                                    hwnd,
  200.                                                                    (HMENU)(i+6),
  201.                                                                    hInstance,
  202.                                                                    NULL);
  203.                         OldScroll[i]=(WNDPROC)SetWindowLong(hScroll[i],GWL_WNDPROC,(LONG)ScrollProc);
  204. /*
  205. */
  206.                         hBrush[i]=CreateSolidBrush(crPrim[i]);
  207.                 }
  208.                 hBrushStatic=CreateSolidBrush(GetSysColor(COLOR_BTNHIGHLIGHT));
  209.                 cyChar=HIWORD(GetDialogBaseUnits());
  210.                 return 0;
  211.         case WM_SIZE:
  212.                  cxClient=LOWORD(lParam);
  213.                  cyClient=HIWORD(lParam);
  214.                  
  215.                  SetRect(&rcColor,cyClient/2,0,cxClient,cyClient);
  216. /*
  217. BOOL SetRect(
  218.              __out  LPRECT lprc,
  219.              __in   int xLeft,
  220.              __in   int yTop,
  221.              __in   int xRight,
  222.              __in   int yBottom
  223.                          );
  224.          参数
  225.         lprc [out]   指向RECT 结构的指针,该指针包含了所要设置的矩形。
  226.         xLeft [in]   指定矩形左上角的X坐标。
  227.         yTop [in]    指定矩形左上角的Y坐标。
  228.         xRight [in]  指定矩形右下角的X坐标。
  229.         yBottom [in]  指定矩形右下角的Y坐标。
  230. 返回值
  231.         如果函数超过,返回非零值;否则返回零值。
  232. */

  233.                  MoveWindow(hRect,0,0,cxClient/2,cyClient,TRUE);
  234. /*
  235. 函数原型:BOOL MoveWindow( HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint );

  236. WINUSERAPI  BOOL  WINAPI  MoveWindow(HWND hWnd,
  237.                                      int X,
  238.                                      int Y,
  239.                                      int nWidth,
  240.                                      int nHeight,
  241.                                      BOOL bRepaint
  242.                                                                          );
  243. 函数功能:
  244.      该函数改变指定窗口的位置和尺寸。
  245.          对于顶层窗口,位置和尺寸是相对于屏幕的左上角的:
  246.          对于子窗口,位置和尺寸是相对于父窗口客户区的左上角坐标的。
  247.   
  248.     hWnd:窗口句柄。
  249.     x:指定窗口的新位置的左边界。
  250.     Y:指定窗口的新位置的顶部边界
  251.     nWidth:指定窗口的新的宽度。
  252.     nHaight:指定窗口的新的高度。
  253.     bRepaint:确定窗口是否被刷新。
  254.                  如果该参数为TRUE,窗口接收一个WM_PAINT消息;
  255.                          如果参数为FALSE,不发生任何刷新动作。
  256.                          它适用于客户区,非客户区(包括标题栏和滚动条),及由于移动子窗口而露出的父窗口的区域。
  257.                          如果参数为FALSE,应用程序就必须明确地使窗口无效或重画该窗口和需要刷新的父窗口。

  258.     返回值:如果函数成功,返回值为非零;如果函数失败,返回值为零。若想获得更多错误信息,请调用GetLastError函数。
  259. */
  260.                  for(i=0;i<3;i++)
  261.                  {
  262.                          MoveWindow(hScroll[i],(2*i+1)*cxClient/14,2*cyChar,cxClient/14,cyClient-4*cyChar,TRUE);
  263.                          MoveWindow(hLabel[i],(4*i+1)*cyClient/28,cyChar/2,cxClient/7,cyChar,TRUE);
  264.                          MoveWindow(hValue[i],(4*i+1)*cxClient/28,cyClient-3*cyChar/2,cxClient/7,cyChar,TRUE);
  265.                          SetFocus(hwnd);
  266.                  }

  267.         //case WM_PAINT:
  268.         //        hdc=BeginPaint(hwnd,&ps);
  269.     //    FillRect(hdc,&rcDraw,(HBRUSH)GetStockObject(GRAY_BRUSH));
  270.         //        EndPaint(hwnd,&ps);
  271.                 return 0;
  272.         case WM_SETFOCUS:
  273.                 SetFocus(hScroll[idFocus]);
  274.                 return 0;
  275.         case WM_HSCROLL:
  276.                 i=GetWindowLong((HWND)lParam,GWL_ID);
  277.                 switch(LOWORD(wParam))
  278.                 {
  279.                 case SB_PAGEDOWN:
  280.                         color[i]+=15;
  281.                 case SB_LINEDOWN:
  282.                         color[i]=min(255,color[i]+1);
  283.                         break;
  284.                 case SB_PAGEUP:
  285.                         color[i]-=15;
  286.                 case SB_LINEUP:
  287.                         color[i]=max(0,color[i]-1);
  288.                         break;
  289.                 case SB_TOP:
  290.             color[i]=0;
  291.                         break;
  292.                 case SB_BOTTOM:
  293.                         color[i]=255;
  294.                         break;
  295.                 case SB_THUMBPOSITION:
  296.                 case SB_THUMBTRACK:
  297.                         color[i]=HIWORD(wParam);
  298.                         break;
  299.                 default:
  300.                         break;
  301.                 }
  302.                 SetScrollPos(hScroll[i],SB_CTL,color[i],TRUE);
  303.                 wsprintf(szBuffer,TEXT("%i"),color[i]);
  304.                 SetWindowText(hValue[i],szBuffer);
  305.                 DeleteObject((HBRUSH)SetClassLong(hwnd,GCL_HBRBACKGROUND,(LONG)CreateSolidBrush(RGB(color[0],color[1],color[2]))));
  306.                 InvalidateRect(hwnd,&rcColor,TRUE);
  307.                 return 0;
  308.         case WM_CTLCOLORSCROLLBAR:
  309.                 i=GetWindowLong((HWND)lParam,GWL_ID);
  310.                 return (LRESULT)hBrush[i];
  311.         case WM_CTLCOLORSTATIC:
  312.             i=GetWindowLong((HWND)lParam,GWL_ID);
  313.         if(i>=3 && i<=8)
  314.                 {
  315.                         SetTextColor((HDC)wParam,crPrim[i%3]);
  316.                         SetBkColor((HDC)wParam,GetSysColor(COLOR_BTNHIGHLIGHT));
  317.                         return (LRESULT)hBrushStatic;
  318.                 }
  319.                 break;
  320.         case WM_SYSCOLORCHANGE:
  321.                 DeleteObject(hBrushStatic);
  322.                 hBrushStatic=CreateSolidBrush(GetSysColor(COLOR_BTNHIGHLIGHT));
  323.                 return 0;
  324.         case WM_DESTROY:
  325.                 DeleteObject((HBRUSH)SetClassLong(hwnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(WHITE_BRUSH)));
  326.                 for(i=0;i<3;i++)
  327.                         DeleteObject(hBrush[i]);
  328.                 DeleteObject(hBrushStatic);
  329.                 PostQuitMessage(0);
  330.                 return 0;
  331.         }
  332.        
  333.         return DefWindowProc(hwnd,message,wParam,lParam);
  334. }

  335. LRESULT CALLBACK ScrollProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  336. {
  337.         int id=GetWindowLong(hwnd,GWL_ID);
  338.         switch(message)
  339.         {
  340.         case WM_KEYDOWN:
  341.                 if(VK_TAB==wParam)
  342.                         SetFocus(GetDlgItem(GetParent(hwnd),(id+(GetKeyState(VK_SHIFT)<0?2:0))%3));
  343.                 break;
  344.         case WM_SETFOCUS:
  345.                 idFocus=id;
  346.                 break;
  347.         }
  348.         return DefWindowProc(hwnd,message,wParam,lParam);
  349. }
复制代码

Rank: 1

主题
0
帖子
14
C币
56 枚
在线时间
3 小时
发表于 2011-9-13 10:50:14 |显示全部楼层
好东西啊。。。。

Rank: 3Rank: 3

主题
5
帖子
76
C币
150 枚
在线时间
0 小时
发表于 2011-11-16 17:24:36 |显示全部楼层
    你的耐性真好......
不要为自己找什么所谓的借口。
您需要登录后才可以回帖 登录 | 加入社区!

C语言 ( 粤ICP备11042647号-2 )

GMT+8, 2012-5-20 18:03

©2009-2011 cyuyan.com.cn

回顶部