15 Windows编程——系统内置窗口子类型之button
Posted kelamoyujuzhen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了15 Windows编程——系统内置窗口子类型之button相关的知识,希望对你有一定的参考价值。
button子类型BS_3STATE、BS_AUTO3STATE、BS_AUTOCHECKBOX
源码
1 #include<Windows.h> 2 #include<Windowsx.h> 3 4 LRESULT CALLBACK WindProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); 5 6 int WinMain(HINSTANCE hInst, HINSTANCE tmp, LPSTR szCmd, int nShow) 7 { 8 WNDCLASS WndClass; 9 TCHAR* ClassName = TEXT("MyClass"); 10 HWND hwnd; 11 MSG msg; 12 13 WndClass.cbClsExtra = 0; 14 WndClass.cbWndExtra = 0; 15 WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); 16 WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); 17 WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); 18 WndClass.hInstance = hInst; 19 WndClass.lpfnWndProc = WindProc; 20 WndClass.lpszClassName = ClassName; 21 WndClass.lpszMenuName = NULL; 22 WndClass.style = CS_VREDRAW | CS_HREDRAW; 23 24 if (!RegisterClass(&WndClass)) 25 { 26 MessageBox(NULL, TEXT("Gegister Class Fail!!"), TEXT("error"), MB_OK); 27 return 0; 28 } 29 30 //CreateWindow返回之前,会发送WM_CREATE消息 31 hwnd = CreateWindow(ClassName, TEXT("Hello"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 300, NULL, NULL, hInst, NULL); 32 if (hwnd == NULL) 33 { 34 MessageBox(NULL, TEXT("Create Window Fail!!"), TEXT("error"), MB_OK); 35 return 0; 36 } 37 ShowWindow(hwnd, nShow); 38 UpdateWindow(hwnd); 39 40 while (GetMessage(&msg, NULL, 0, 0)) 41 { 42 TranslateMessage(&msg); 43 DispatchMessage(&msg); 44 } 45 46 return 0; 47 } 48 49 LRESULT CALLBACK WindProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 50 { 51 PAINTSTRUCT pt; 52 static int check_status = 0; 53 static HWND button,button1, button2,statichwnd, statichwnd1, statichwnd2; 54 HDC hdc; 55 HBRUSH hBrush = CreateSolidBrush(RGB(0, 0, 240)); 56 switch (message) 57 { 58 case WM_CREATE: 59 button = CreateWindow(TEXT("button"), TEXT("BS_3STATE"), WS_CHILD | WS_VISIBLE|BS_3STATE, 0, 0, 0, 0, hwnd, (HMENU)1, GetModuleHandle(NULL), NULL); 60 statichwnd = CreateWindow(TEXT("static"), NULL, WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hwnd, (HMENU)10, GetModuleHandle(NULL), NULL); 61 button1 = CreateWindow(TEXT("button"), TEXT("BS_AUTO3STATE"), WS_CHILD | WS_VISIBLE | BS_AUTO3STATE, 0, 0, 0, 0, hwnd, (HMENU)2, GetModuleHandle(NULL), NULL); 62 statichwnd1 = CreateWindow(TEXT("static"), NULL, WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hwnd, (HMENU)20, GetModuleHandle(NULL), NULL); 63 button2 = CreateWindow(TEXT("button"), TEXT("BS_AUTOCHECKBOX"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 0, 0, 0, 0, hwnd, (HMENU)3, GetModuleHandle(NULL), NULL); 64 statichwnd2 = CreateWindow(TEXT("static"), NULL, WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hwnd, (HMENU)30, GetModuleHandle(NULL), NULL); 65 return 0; 66 case WM_SIZE: 67 MoveWindow(button, 10, 10, 160, 20, TRUE); 68 MoveWindow(statichwnd, 200, 10, 200, 20, TRUE); 69 MoveWindow(button1, 10, 40, 160, 20, TRUE); 70 MoveWindow(statichwnd1, 200, 40, 200, 20, TRUE); 71 MoveWindow(button2, 10, 70, 160, 20, TRUE); 72 MoveWindow(statichwnd2, 200, 70, 200, 20, TRUE); 73 return 0; 74 case WM_COMMAND: 75 //处理button按钮,手动点选按钮 76 if (LOWORD(wParam)==1) 77 { 78 switch (HIWORD(wParam)) 79 { 80 case BN_CLICKED: 81 check_status++; 82 if (check_status % 3 == 1) 83 { 84 SendMessage((HWND)lParam, BM_SETCHECK, BST_CHECKED, NULL); 85 SetWindowText(statichwnd, TEXT("BST_CHECKED")); 86 } 87 else if (check_status % 3 == 2) 88 { 89 SendMessage((HWND)lParam, BM_SETCHECK, BST_INDETERMINATE, NULL); 90 SetWindowText(statichwnd, TEXT("BST_INDETERMINATE")); 91 } 92 else 93 { 94 SendMessage((HWND)lParam, BM_SETCHECK, BST_UNCHECKED, NULL); 95 SetWindowText(statichwnd, TEXT("BST_UNCHECKED")); 96 } 97 break; 98 default: 99 break; 100 } 101 } 102 //处理button1按钮,自动点选按钮 103 else if (LOWORD(wParam) == 2) 104 { 105 switch (HIWORD(wParam)) 106 { 107 case BN_CLICKED: 108 if (SendMessage(button1,BM_GETCHECK,NULL,NULL)==BST_CHECKED) 109 { 110 SetWindowText(statichwnd1, TEXT("BST_CHECKED")); 111 } 112 else if (SendMessage(button1, BM_GETCHECK, NULL, NULL) == BST_INDETERMINATE) 113 { 114 SetWindowText(statichwnd1, TEXT("BST_INDETERMINATE")); 115 } 116 else 117 { 118 SetWindowText(statichwnd1, TEXT("BST_UNCHECKED")); 119 } 120 break; 121 default: 122 break; 123 } 124 } 125 //处理button2按钮,自动点选按钮,这个按钮只有2种状态 126 else if (LOWORD(wParam) == 3) 127 { 128 switch (HIWORD(wParam)) 129 { 130 case BN_CLICKED: 131 if (SendMessage(button2, BM_GETCHECK, NULL, NULL) == BST_CHECKED) 132 { 133 SetWindowText(statichwnd2, TEXT("BST_CHECKED")); 134 } 135 else 136 { 137 SetWindowText(statichwnd2, TEXT("BST_UNCHECKED")); 138 } 139 break; 140 default: 141 break; 142 } 143 } 144 return 0; 145 case WM_DESTROY: 146 PostQuitMessage(0); 147 return 0; 148 default: 149 break; 150 } 151 152 return DefWindowProc(hwnd, message, wParam, lParam); 153 }
运行结果
button子类型BS_AUTORADIOBUTTON、BS_GROUPBOX、BS_DEFPUSHBUTTON
源码
1 #include<Windows.h> 2 #include<WinUser.h> 3 #include<tchar.h> 4 #include<stdio.h> 5 6 LRESULT CALLBACK WindProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); 7 8 int WinMain(HINSTANCE hInst, HINSTANCE tmp, LPSTR szCmd, int nShow) 9 { 10 WNDCLASS WndClass; 11 TCHAR* ClassName = TEXT("MyClass"); 12 HWND hwnd; 13 MSG msg; 14 15 WndClass.cbClsExtra = 0; 16 WndClass.cbWndExtra = 0; 17 WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); 18 WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); 19 WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); 20 WndClass.hInstance = hInst; 21 WndClass.lpfnWndProc = WindProc; 22 WndClass.lpszClassName = ClassName; 23 WndClass.lpszMenuName = NULL; 24 WndClass.style = CS_VREDRAW | CS_HREDRAW; 25 26 if (!RegisterClass(&WndClass)) 27 { 28 MessageBox(NULL, TEXT("Gegister Class Fail!!"), TEXT("error"), MB_OK); 29 return 0; 30 } 31 32 //CreateWindow返回之前,会发送WM_CREATE消息 33 hwnd = CreateWindow(ClassName, TEXT("Hello"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 800, NULL, NULL, hInst, NULL); 34 if (hwnd == NULL) 35 { 36 MessageBox(NULL, TEXT("Create Window Fail!!"), TEXT("error"), MB_OK); 37 return 0; 38 } 39 ShowWindow(hwnd, nShow); 40 UpdateWindow(hwnd); 41 42 while (GetMessage(&msg, NULL, 0, 0)) 43 { 44 TranslateMessage(&msg); 45 DispatchMessage(&msg); 46 } 47 48 return 0; 49 } 50 51 LRESULT CALLBACK WindProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 52 { 53 PAINTSTRUCT pt; 54 static int check_status = 0; 55 HDC hdc; 56 static HWND radio1[3], radio2[3]; 57 static HWND defpushbutton; 58 static HWND shwnd; 59 static HWND group1, group2; 60 TCHAR *r_str1 [3] = { 61 TEXT("男人"),TEXT("女人"),TEXT("人妖")}; 62 TCHAR *r_str2[3] = { 63 TEXT("已婚"),TEXT("未婚"),TEXT("热恋") }; 64 TCHAR buf[100]; 65 int i; 66 static int sex = 0; 67 static int marry = 0; 68 switch (message) 69 { 70 case WM_CREATE: 71 for (i = 0; i < 3; i++) 72 { 73 radio1[i]= CreateWindow(TEXT("button"), r_str1[i], WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 0, 0, 0, 0, hwnd, (HMENU)(100+i), GetModuleHandle(NULL), NULL); 74 } 75 for (i = 0; i < 3; i++) 76 { 77 radio2[i] = CreateWindow(TEXT("button"), r_str2[i], WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 0, 0, 0, 0, hwnd, (HMENU)(200 + i), GetModuleHandle(NULL), NULL); 78 } 79 group1= CreateWindow(TEXT("button"), TEXT("性别"), WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 0, 0, 0, 0, hwnd, (HMENU)(300), GetModuleHandle(NULL), NULL); 80 group2 = CreateWindow(TEXT("button"), TEXT("婚姻"), WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 0, 0, 0, 0, hwnd, (HMENU)(400), GetModuleHandle(NULL), NULL); 81 82 defpushbutton = CreateWindow(TEXT("button"), TEXT("确定"), WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 0, 0, 0, 0, hwnd, (HMENU)(500), GetModuleHandle(NULL), NULL); 83 shwnd = CreateWindow(TEXT("static"), NULL, WS_CHILD | WS_VISIBLE , 0, 0, 0, 0, hwnd, (HMENU)(600), GetModuleHandle(NULL), NULL); 84 return 0; 85 case WM_SIZE: 86 for (i = 0; i < 3; i++) 87 { 88 MoveWindow(radio1[i], 10, 40+i*30, 85, 20, TRUE); 89 } 90 for (i = 0; i < 3; i++) 91 { 92 MoveWindow(radio2[i], 10, 160 + i * 30, 85, 20, TRUE); 93 } 94 MoveWindow(group1, 5, 10, 110, 120, TRUE); 95 MoveWindow(group2, 5, 130, 110, 120, TRUE); 96 SetWindowLong(radio1[0], GWL_STYLE, (LONG)WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP); 97 SetWindowLong(radio2[0], GWL_STYLE, (LONG)WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP); 98 99 MoveWindow(defpushbutton, 20, 260, 70, 20, TRUE); 100 MoveWindow(shwnd, 200, 10, 200, 235, TRUE); 101 return 0; 102 case WM_COMMAND: 103 //HIWORD(wParam)控件通知码 lParam控件的窗口句柄 104 if (HIWORD(wParam) == BN_CLICKED && (LPARAM)defpushbutton !=lParam) 105 { 106 if ((LPARAM)radio1[0] == lParam) 107 { 108 sex = 1; 109 } 110 else if ((LPARAM)radio1[1] == lParam) 111 { 112 sex = 2; 113 } 114 else if ((LPARAM)radio1[2] == lParam) 115 { 116 sex = 3; 117 } 118 119 if ((LPARAM)radio2[0] == lParam) 120 { 121 marry = 1; 122 } 123 else if ((LPARAM)radio2[1] == lParam) 124 { 125 marry = 2; 126 } 127 else if ((LPARAM)radio2[2] == lParam) 128 { 129 marry = 3; 130 } 131 } 132 if ((LPARAM)defpushbutton == lParam) 133 { 134 if (sex == 0 | marry == 0) 135 { 136 _stprintf(buf, TEXT("请选择性别或婚姻状态")); 137 SetWindowText(shwnd, buf); 138 } 139 else 140 { 141 _stprintf(buf, TEXT("我是%s,我%s"), r_str1[sex - 1], r_str2[marry - 1]); 142 SetWindowText(shwnd, buf); 143 } 144 } 145 return 0; 146 case WM_DESTROY: 147 PostQuitMessage(0); 148 return 0; 149 default: 150 break; 151 } 152 153 return DefWindowProc(hwnd, message, wParam, lParam); 154 }
运行结果:
以上是关于15 Windows编程——系统内置窗口子类型之button的主要内容,如果未能解决你的问题,请参考以下文章
深入delphi编程理解之消息WINDOWS原生窗口编写及消息处理过程
《逐梦旅程 WINDOWS游戏编程之从零开始》读书笔记1——创建窗口
Windows API编程(不是MFC)用CreateWindowEx创建的按钮等子窗口控件是默认的Windows经典样式,如何改变?