以下内容转自http://blog.csdn.net/aasmfox/article/details/8451950,多谢博主
aasmfox
看着MFC向导生成的程序,总归是一头的雾水,看不清,搞不懂.
还是老老实实的学下C语言吧.
但是只学C语言的的内容是很单调的,于是要结合window的基础编程一起学习.
这样才能学以致用.
以前看书都是坚持不到最后,最多看到一半就没有耐心了.学到的知识也不能完整的消息吸收.
现在回过头来,还是认清自己的真实基础,那是真心只能一点皮毛,还是要脚踏实地的好好学习.
学习window的基础,还是先学一个CreateWindow函数吧.这个函数是基础中的基础.
现在重新用C语言进行学习.整理一下,记录在这里.总是一个学习日记吧.
1.关于消息映射
用C语言进行编程时,要对很多的window消息进行处理.这是必须的.
没有办法.
书上的写法都是使用 switch case来进行判断处理.这个很麻烦.总觉得这样写出来的东西,不方便,也不顺手.
虽然有一个windowx.h中的HANDLE_MSG宏,可以方便一点使用.这也有一个麻烦的事情要处理.
就是要记住函数的定义格式.对于学习来说,这样又点不顺心了.
我的想法是,在学习的时候,不需要什么代码的优秀和高质量.
关键在于,学习的时候,对照书本的知识点,可以迅速的进行代码验证,并行到运行结果.
所以.写代码的时候,要有针对性,只要快点,方便点就发了.
以前学C语言的时候,不会用.这次看书后,照着MFC中的消息处理样子,自己弄了一个宏来处理.
代码如下:
- BEGIN_MESSAGE_MAP(WIN)
- ON_MESSAGE(WIN,WM_CREATE,OnCreate)
- ON_MESSAGE(WIN,WM_CLOSE,OnClose)
- ON_MESSAGE(WIN,WM_LBUTTONDOWN,OnLButtonDown)
- ON_MESSAGE(WIN,WM_PAINT,OnPaint)
- END_MESSAGE_MAP()
用于处理一些常用的消息函数,对应的 OnPaint,OnClose,OnCreate函数,则统一定义成以下格式
-
LRESULT
Fnnction(
HWND
hwnd)
这样就不用去记忆那些wpapa和lparam的意义了.
直接把这两个值保存到window的prop属性中,如果函数需要使用的话,可以重新读取,这个一头一尾宏定义,可以方便我自己写代码的更方便一点.
-
#define DECLARE_MESSAGE_MAP(T) LRESULT CALLBACK T##_WndProc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp);
-
#define BEGIN_MESSAGE_MAP(T) LRESULT CALLBACK T##_WndProc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp){ \
-
SetProp(hwnd,L
“WP”
,(
HANDLE
)wp);SetProp(hwnd,L
“LP”
,(
HANDLE
)lp); \ -
if
(!msg) \ -
return
0 ;
再定义一个ON_MESSAGE宏,可以处理各个消息了.
-
#define ON_MESSAGE(ID,message,fn) else if(msg==message) return ID##_##fn(hwnd);
为了取出保存后的wparam和lparam参数,于是,又要写2个宏.
-
#define Getlparam(H) (LPARAM)GetProp(##H,L”LP”)
-
#define Getwparam(H) (WPARAM)GetProp(##H,L”WP”)
2.SetwindowText函数的处理
C语言中处理字符串不太方便,SetWindowText只能设置字符串,了为方便点设置窗口文件,重新写一个函数,类似于Printf,什么格式,自己定义就好了,不用转换了.
-
int
SetWindowString(
HWND
hwnd,
LPCWSTR
pszFormat,…) - {
-
va_list
args; - va_start(args, pszFormat);
-
LPWSTR
pstrText=FormatString(pszFormat,args); - va_end(args);
- ::SetWindowText(hwnd,pstrText);
-
delete
pstrText; -
return
0; - }
有这2个东东,学C语言省了一点力气.