开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1232|回复: 8
收起左侧

[图文教程] win32api窗口程序开发第六天窗口组件3--复选框

[复制链接]
结帖率:0% (0/2)
发表于 2020-1-20 07:17:42 | 显示全部楼层 |阅读模式   山东省烟台市
hButton[0] = CreateWindow("BUTTON","按钮", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,10,10,100,50,hwnd,(HMENU)IDC_BTN1,(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),NULL);
hButton[1] = CreateWindow("BUTTON","退出", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,10,60,100,50,hwnd,(HMENU)IDC_BTN2,(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),NULL);
hButton[2] = CreateWindow("BUTTON","加1", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,10,110,100,50,hwnd,(HMENU)IDC_BTN3,(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL);
hButton[3] = CreateWindow("BUTTON","减1", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,10,160,100,50,hwnd,(HMENU)IDC_BTN4,(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL);        
radioB[0] = CreateWindow("BUTTON","单选框1",WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON,10,220,120,30,hwnd,NULL,(HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE),NULL);//创建单选框
radioB[1] = CreateWindow("BUTTON","单选框2",WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON,10,260,120,30,hwnd,NULL,(HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE),NULL);//创建单选框
hCheck[0] = CreateWindow("Button","复选框1",WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,10, 300,120, 30,hwnd,(HMENU)IDC_CHECK1,(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL); //创建复选框
hCheck[1] = CreateWindow("Button","复选框2",WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,10, 340,120, 30,hwnd,(HMENU)IDC_CHECK2,(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
hEdit=CreateWindow("EDIT","编辑框",WS_VISIBLE|WS_CHILD|WS_BORDER|ES_MULTILINE|ES_WANTRETURN,10,380,200,50,hwnd,(HMENU)IDC_Edit,(HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE),NULL);//创建文本


用 IsDlgButtonChecked   这个API判断是否选中
该函数可以确定某个按钮控件是否有选中标志,或者三态按钮控制是否为**的、选中的、或两者都不是。
函数原型:UINT IsDlgButtonChecked(HWND hDlg,Int nlDBUtton);
参数:
hDlg:指向包含按钮控制的对话框。
nkDButtom:指定按钮控制的整型标识符。
返回值:使用BS_AUTOCHECKBOX、BS_AUTORADIOBUTTON、BS_AUTO3STATE、BS_CHECKBOX、BS_RADIOBUTION或BS_3STATE样式创建的按钮的返回值可以是如下值之一:
BST_CHECKED:表示按钮被选中。
BST_INDETERMINATE:表示按钮是**的,即为不确定状态(只有具有BS_3STATE或BS_AUTO3STATE样式的按钮才使用该值)。
BST_UNCHECKED:表示该按钮未选中(unckecked)。如果该按钮用其他任何样式,那么返回值为零。
速查:Windows NT:3.1及以11版本;Windows:95及以上版本;Windows CE:不支持:头文件:winuser.h;库文件:user32.lib。


if((HWND)lParam == hCheck[0])
                        {
                                //MessageBox(hwnd,TEXT("选择框1被单击"),TEXT("标题:"),MB_YESNO);
                                
                                if(BST_CHECKED == IsDlgButtonChecked(hwnd, IDC_CHECK1))
                                {
                                MessageBox(hwnd,TEXT("选择框1被单击且被选中"),TEXT("标题:"),MB_YESNO);
                                }
                                else
                                {
                                MessageBox(hwnd,TEXT("选择框1被单击且被取消选中"),TEXT("标题:"),MB_YESNO);
                                }        
                        }
         if((HWND)lParam == hCheck[1])
                        {
                                //MessageBox(hwnd,TEXT("选择框2被单击"),TEXT("标题:"),MB_YESNO);
                                if(BST_CHECKED == IsDlgButtonChecked(hwnd, IDC_CHECK2))
                                {
                                MessageBox(hwnd,TEXT("选择框2被单击且被选中"),TEXT("标题:"),MB_YESNO);
                                }
                                else
                                {
                                MessageBox(hwnd,TEXT("选择框2被单击且被取消选中"),TEXT("标题:"),MB_YESNO);
                                }

                        }                        


最后指出,窗口初始化后,默认底色不是纯白或纯黑的,修改代码:
           wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);   //    纯白     
           wndclass.hbrBackground=CreateSolidBrush(RGB(240,240,240));   //背景颜色
这样窗口的单选框就没有难看烦人的框框了

最后加上自己喜欢的LOGO机器猫图标,图标文件需和exe文件同文件夹
                      wndclass.hIcon=(HICON)LoadImage(NULL,"i.ico",IMAGE_ICON,48,48,LR_LOADFROMFILE);//加载图标
mywnd.zip (238.44 KB, 下载次数: 12)
发表于 2022-5-6 19:22:40 | 显示全部楼层   广东省珠海市
支持。辛苦你了
回复 支持 反对

使用道具 举报

结帖率:0% (0/2)
 楼主| 发表于 2020-1-22 14:31:03 | 显示全部楼层   山东省烟台市
jingyixiaocai 发表于 2020-1-22 14:30
CreateWindowExW(0,L"BUTTON",L"按钮", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,10,10,1 ...

[Error] C:\Users\Administrator\Desktop\mywnd9\wndc9.C:73:29: converting to execution character set: Illegal byte sequence
回复 支持 反对

使用道具 举报

结帖率:0% (0/2)
 楼主| 发表于 2020-1-22 14:30:29 | 显示全部楼层   山东省烟台市
项目部006 发表于 2020-1-22 10:48
加个L怎么会报错? 加个L的字符串类型是 LPCWSTR , 你看你参数位置对了没有

CreateWindowExW(0,L"BUTTON",L"按钮", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,10,10,100,50,hwnd,(HMENU)IDC_BTN1,NULL,NULL);               
               
//     HWND CreateWindowExW(DWORD, LPCWSTR, LPCWSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID);
回复 支持 反对

使用道具 举报

签到天数: 3 天

发表于 2020-1-22 10:48:09 | 显示全部楼层   广东省揭阳市
jingyixiaocai 发表于 2020-1-20 21:08
hButton[0] = CreateWindowExW(0, L"BUTTON",L"按钮", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSH ...

加个L怎么会报错? 加个L的字符串类型是 LPCWSTR , 你看你参数位置对了没有
回复 支持 反对

使用道具 举报

结帖率:0% (0/2)
 楼主| 发表于 2020-1-20 21:22:47 | 显示全部楼层   山东省烟台市

完全正确,我测试过这样效率
回复 支持 反对

使用道具 举报

结帖率:0% (0/2)
 楼主| 发表于 2020-1-20 21:08:29 | 显示全部楼层   山东省烟台市
本帖最后由 jingyixiaocai 于 2020-1-20 21:16 编辑
项目部006 发表于 2020-1-20 11:04
hButton[0] = CreateWindow("BUTTON","按钮", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,10, ...

hButton[0] = CreateWindowExW(0, L"BUTTON",L"按钮", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,10,10,100,50,hwnd,(HMENU)IDC_BTN1,NULL,NULL);
这样我编译不过,提示  L  非法字节  去掉L通过但是警告:68: warning: passing arg 2 of `CreateWindowExW' from incompatible pointer type    不兼容的指针类型传递啊
那两种方法 可以
我还是用第一个方法了,谢谢啊
回复 支持 反对

使用道具 举报

签到天数: 3 天

发表于 2020-1-20 11:19:29 | 显示全部楼层   广东省揭阳市
QQ截图20200120111904.png
回复 支持 反对

使用道具 举报

签到天数: 3 天

发表于 2020-1-20 11:04:30 | 显示全部楼层   广东省揭阳市
hButton[0] = CreateWindow("BUTTON","按钮", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,10,10,100,50,hwnd,(HMENU)IDC_BTN1,(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),NULL);

有必要改成
hButton[0] = CreateWindow(TEXT("BUTTON"),TEXT("按钮"), WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,10,10,100,50,hwnd,(HMENU)IDC_BTN1,NULL,NULL);
如果你是用vs生成的代码的话, 那有一个全局变量是 hInst, 你可以在 hInstance 参数传NULL, 或者传入这个hInst

或者修改成直接调用api, 不使用宏, 明确的表示这个api是使用了什么字符集
hButton[0] = CreateWindowExW(0, L"BUTTON",L"按钮", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,10,10,100,50,hwnd,(HMENU)IDC_BTN1,NULL,NULL);

或者
hButton[0] = CreateWindowExA(0, "BUTTON","按钮", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,10,10,100,50,hwnd,(HMENU)IDC_BTN1,NULL,NULL);

如果需要考虑切换字符集的话, 第一种优先考虑, 其次是第二种, 固定为Unicode版, 多字节版个人不是很推荐使用
A版api的作用只是在内部把多字节转换成Unicode, 然后在调用W版的api, 直接调用W版api从效率上来说是会比A版快一点
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表