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

  • Post author:
  • Post category:其他


以下内容转自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. #define     BEGIN_MESSAGE_MAP(T)  LRESULT CALLBACK T##_WndProc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp){ \
  3. SetProp(hwnd,L

    “WP”

    ,(

    HANDLE

    )wp);SetProp(hwnd,L

    “LP”

    ,(

    HANDLE

    )lp); \

  4. if

    (!msg)  \

  5. 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语言省了一点力气.