您的位置:首页 > 编程语言 > C语言/C++

C语言初学者:使用CreateWindow创建一个窗口

2012-12-30 00:11 295 查看
看着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语言省了一点力气.

源代码链接地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: