如何用纯Win32 SDK编写GUI程序
1个回答
展开全部
因此不会对一些基础的知识作过多的讲解。如果大家有需要,我在就某些细节作进一步的解释。编写Windows下面的GUI程序,比较有影响力的就是MS的Visual Studio系列和Borland的BCB系列。BCB需要在程序发布的时候,多带一些borland提供的库,比较的麻烦。所以我很少用。如果用VS系列来编写GUI程序,主要有两个方式,第一就是用微软提供的MFC来作,第二就是用纯的Win32 SDK来编写GUI程序。众所周知的原因,MFC对Win32 SDK的包装比较的失败,不如BCB那样的流畅,有时候你很难在程序中发挥自己的思路,因此,我一般就是用纯的Win32 SDK来编写GUI程序,而不用晦涩的MFC,因为用MFC,你不仅仅要知道Win32 SDK,还需要查询MFC的一些技巧,实在得不偿失。用Win32 SDK编写GUI的难处在于,有时候你需要为了一个简单的事情而查询很多的资料与SDK文档。但是你得到的却是对Windows系统的透彻理解和程序运行的高效,轻量化。因为用Win32 SDK需要的库都是内含在每一个Windows系统中的。理论上来说,只要是Windows系统,你的程序就可以正确无误的运行。下面就我最近编写Windows GUI程序的碰到的一些问题一一说明。首先,看一下程序的最终运行效果图(我的编译器是VC6): 1 用VC6的Win32程序搭好框架之后,就添加自己的模式对话框,碰到的第一个问题就是如何设置Radio控件(有的中文书翻译为 单选按钮)的初始状态和查询最终的结果。经过一番努力查询Win32 SDK之后,标准答案如下:设置Radio的初始状态:BOOL CheckDlgButton(HWNDhDlg,int nlDButton,UINT uCheck);获得Radio控件的最终状态:UINT IsDlgButtonChecked(HWND hDlg,Int nlDBUtton);2 如何处理slider control(中文叫做滑竿控件)的相关事件。slider control,其实和上面的那个简单的radio control还是有本质的区别的。radio control是内含在windows的一般库里面的。不需要特别的库的支持,而slider control(英文也叫track bar)是需要COMCTL32.lib的支持,要用这个slider control,你需要作三个动作。a 在源文件里面加入COMCTL32.lib的引用。b 在头文件里面加入对commctl.h的声明,一般加到stdafx.h即可。#include // Add by liuzhi.
c 在程序里面,需要加入使用common control的宏:InitCommonControls();否则,程序会闪一下就会退出的。因为程序没有申请到该有的资源。 加入对slider control的声明后。需要处理slider control的一些事件。这是需要特别注意的是,slider control不像radio control那样子直接用SDK API就可以处理了。需要特殊的消息机制,下面一一道来:2.1 获得控件的窗口句柄。slider control也是一个窗口,是对话框的子窗口,因此,要用GetDlgItem来实现:backlight_wnd = GetDlgItem(hDlg, IDC_SLIDER_BACKLIGHT);2.2 设置slider control的区间,是给slider control发TBM_SETRANGE消息,比如我设置0到100就是:SendMessage(backlight_wnd,TBM_SETRANGE, (WPARAM)1,(LPARAM)MAKELONG(0,100));2.3 设置滑块的初始位置是发送TBM_SETPOS消息来实现的: SendMessage(backlight_wnd,TBM_SETPOS, (WPARAM)1,(LPARAM)BacklightPercentage);
2.4 slider control和用户的交互,则是通过WM_HSCROLL消息来实现的,需要在WM_HSCROLL的响应函数里面发送TBM_GETPOS消息得到当前滑块的位置:BacklightPercentage = (unsigned char)SendMessage(backlight_wnd,TBM_GETPOS,0,0);2.5 旁边的一个当前刻度的数字的说明,需要先设定一个Static text文本控件,然后动态给该控件发送WM_SETTEXT消息来实现动态的更新数字:SendMessage(GetDlgItem(hDlg, IDC_STATIC_BACKLIGHT_VALUE), WM_SETTEXT, 0, LPARAM(szBacklightPercentage));最后面的那个参数,szBacklightPercentage是一个字符串。3 如何在对话框里面显示图标或者图片:如果程序没有图片,总是显得十分的死板,因此,在程序上面显示图片,图标是必要的美化程序的方法。网上关于程序显示图片的说明也很多。但是都比较的复杂。如果仅仅显示静态的图标,其实不用那么复杂的。3.1 需要好的icon素材。漂亮的icon素材就如程序的脸蛋一样。是必须的,要得到好的icon素材,第一是到网上“淘宝”。看看能不能找到你满意的。另外也有搜索自己电脑上漂亮图标的工具。因为windows自己也提供了很多的图标资源。这里推荐一个叫做 IconExtract 的小软件。大家可以网上下载,它可以很方便的把本地的图标都挖出来。一般情况下,够我们用的了。找好自己喜欢的图标之后,记得在资源里面的icon项目下引用进来。3.2 显示图标:如果不是动态显示,就只是简单的在对话框上面加picture控件,然后在属性里面指定icon的来源即可。4 如何响应电源插拔事件:在笔记本上面,ac电源插上和拔出的时候,会有背光亮度的改变,因此需要在知道这个电源来源改变的时候来重新获得当前背光,经查询,程序需要响应WM_POWERBROADCAST消息。如果wParam是PBT_APMPOWERSTATUSCHANGE,就需要重新获得当然背光: case WM_POWERBROADCAST:
if (wParam == PBT_APMPOWERSTATUSCHANGE) // Power source maybe changed, check the backlight again.
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_ICON_CONFIG2); // IDI_SMALL这样子修改之后,你会发现,程序运行的显示图标是改变了。但是程序exe的图标还是没有改变,这是因为exe和dll默认都显示id为最低的那个icon的图标。因此,在resource.h里面把自己希望显示的图标id和现有的程序图标id换一下就可以了。#define IDI_ICON_CONFIG2 107 // make sure the icon ID is lowest.
好了。
c 在程序里面,需要加入使用common control的宏:InitCommonControls();否则,程序会闪一下就会退出的。因为程序没有申请到该有的资源。 加入对slider control的声明后。需要处理slider control的一些事件。这是需要特别注意的是,slider control不像radio control那样子直接用SDK API就可以处理了。需要特殊的消息机制,下面一一道来:2.1 获得控件的窗口句柄。slider control也是一个窗口,是对话框的子窗口,因此,要用GetDlgItem来实现:backlight_wnd = GetDlgItem(hDlg, IDC_SLIDER_BACKLIGHT);2.2 设置slider control的区间,是给slider control发TBM_SETRANGE消息,比如我设置0到100就是:SendMessage(backlight_wnd,TBM_SETRANGE, (WPARAM)1,(LPARAM)MAKELONG(0,100));2.3 设置滑块的初始位置是发送TBM_SETPOS消息来实现的: SendMessage(backlight_wnd,TBM_SETPOS, (WPARAM)1,(LPARAM)BacklightPercentage);
2.4 slider control和用户的交互,则是通过WM_HSCROLL消息来实现的,需要在WM_HSCROLL的响应函数里面发送TBM_GETPOS消息得到当前滑块的位置:BacklightPercentage = (unsigned char)SendMessage(backlight_wnd,TBM_GETPOS,0,0);2.5 旁边的一个当前刻度的数字的说明,需要先设定一个Static text文本控件,然后动态给该控件发送WM_SETTEXT消息来实现动态的更新数字:SendMessage(GetDlgItem(hDlg, IDC_STATIC_BACKLIGHT_VALUE), WM_SETTEXT, 0, LPARAM(szBacklightPercentage));最后面的那个参数,szBacklightPercentage是一个字符串。3 如何在对话框里面显示图标或者图片:如果程序没有图片,总是显得十分的死板,因此,在程序上面显示图片,图标是必要的美化程序的方法。网上关于程序显示图片的说明也很多。但是都比较的复杂。如果仅仅显示静态的图标,其实不用那么复杂的。3.1 需要好的icon素材。漂亮的icon素材就如程序的脸蛋一样。是必须的,要得到好的icon素材,第一是到网上“淘宝”。看看能不能找到你满意的。另外也有搜索自己电脑上漂亮图标的工具。因为windows自己也提供了很多的图标资源。这里推荐一个叫做 IconExtract 的小软件。大家可以网上下载,它可以很方便的把本地的图标都挖出来。一般情况下,够我们用的了。找好自己喜欢的图标之后,记得在资源里面的icon项目下引用进来。3.2 显示图标:如果不是动态显示,就只是简单的在对话框上面加picture控件,然后在属性里面指定icon的来源即可。4 如何响应电源插拔事件:在笔记本上面,ac电源插上和拔出的时候,会有背光亮度的改变,因此需要在知道这个电源来源改变的时候来重新获得当前背光,经查询,程序需要响应WM_POWERBROADCAST消息。如果wParam是PBT_APMPOWERSTATUSCHANGE,就需要重新获得当然背光: case WM_POWERBROADCAST:
if (wParam == PBT_APMPOWERSTATUSCHANGE) // Power source maybe changed, check the backlight again.
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_ICON_CONFIG2); // IDI_SMALL这样子修改之后,你会发现,程序运行的显示图标是改变了。但是程序exe的图标还是没有改变,这是因为exe和dll默认都显示id为最低的那个icon的图标。因此,在resource.h里面把自己希望显示的图标id和现有的程序图标id换一下就可以了。#define IDI_ICON_CONFIG2 107 // make sure the icon ID is lowest.
好了。
微测检测5.10
2023-05-10 广告
2023-05-10 广告
您好!建议咨 深圳市微测检测有限公司,已建立起十余个专业实验室,企业通过微测检测就可以获得一站式的测试与认 证解决方案;(EMC、RF、MFi、BQB、QI、USB、安全、锂电池、快充、汽车电子EMC、汽车手机互 联、语音通话质量),认证遇...
点击进入详情页
本回答由微测检测5.10提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询