现在的位置: 首页 > 综合 > 正文

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

2013年12月04日 ⁄ 综合 ⁄ 共 2138字 ⁄ 字号 评论关闭

以下内容转自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中的消息处理样子,自己弄了一个宏来处理.

代码如下:

  1. BEGIN_MESSAGE_MAP(WIN)  
  2.     ON_MESSAGE(WIN,WM_CREATE,OnCreate)  
  3.     ON_MESSAGE(WIN,WM_CLOSE,OnClose)  
  4.     ON_MESSAGE(WIN,WM_LBUTTONDOWN,OnLButtonDown)  
  5.     ON_MESSAGE(WIN,WM_PAINT,OnPaint)  
  6. END_MESSAGE_MAP()  

用于处理一些常用的消息函数,对应的 OnPaint,OnClose,OnCreate函数,则统一定义成以下格式

  1. LRESULT Fnnction(HWND hwnd)  

这样就不用去记忆那些wpapa和lparam的意义了.

直接把这两个值保存到window的prop属性中,如果函数需要使用的话,可以重新读取,这个一头一尾宏定义,可以方便我自己写代码的更方便一点.

  1. #define     DECLARE_MESSAGE_MAP(T) LRESULT CALLBACK T##_WndProc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp);  
  2.   
  3. #define     BEGIN_MESSAGE_MAP(T)  LRESULT CALLBACK T##_WndProc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp){ \  
  4.     SetProp(hwnd,L"WP",(HANDLE)wp);SetProp(hwnd,L"LP",(HANDLE)lp); \  
  5.     if(!msg)  \  
  6. return 0 ;   

 

再定义一个ON_MESSAGE宏,可以处理各个消息了.

  1. #define ON_MESSAGE(ID,message,fn)  else if(msg==message) return ID##_##fn(hwnd);  

为了取出保存后的wparam和lparam参数,于是,又要写2个宏.

  1. #define Getlparam(H)   (LPARAM)GetProp(##H,L"LP")  
  2. #define Getwparam(H)   (WPARAM)GetProp(##H,L"WP")  

2.SetwindowText函数的处理

 C语言中处理字符串不太方便,SetWindowText只能设置字符串,了为方便点设置窗口文件,重新写一个函数,类似于Printf,什么格式,自己定义就好了,不用转换了.

  1. int SetWindowString(HWND hwnd,LPCWSTR pszFormat,...)  
  2. {  
  3.     va_list args;  
  4.     va_start(args, pszFormat);    
  5.     LPWSTR pstrText=FormatString(pszFormat,args);    
  6.     va_end(args);    
  7.     ::SetWindowText(hwnd,pstrText);  
  8.     delete  pstrText;   
  9.     return 0;  
  10. }  

有这2个东东,学C语言省了一点力气.

抱歉!评论已关闭.