learning-windows-32 at first

来源:互联网 发布:网络协议栈有什么用 编辑:程序博客网 时间:2024/06/13 23:51

1.  WinMain是一个函数,该函数的功能是被系统调用,作为一个32位应用程序入口点。WinMain函数应初始化应用程序,显示主窗口,进入一个消息接收一发送循环,这个循环是应用程序执行的其余部分的顶级控制结构。

 

2.  消息循环代码是应用程序中主函数WinMain ( )中类似如下的程序段:

while(GetMessage(&msg,NULL,0,0))

{ //从消息队列中取得消息

TranslateMessage(&msg);

//检索并生成字符消息WM_CHAR

DispatchMessage(&msg);

//将消息发送给相应的窗口函数

}

 由此可见,所谓"消息循环",实际是程序循环。

 

3.  如果说消息循环是程序的心臟那个窗口过程就是程序的大脑这里所有送到窗口的息被处理

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){    switch(msg)    {        case WM_CLOSE:            DestroyWindow(hwnd);        break;        case WM_DESTROY:            PostQuitMessage(0);        break;        default:            return DefWindowProc(hwnd, msg, wParam, lParam);    }    return 0;}

  窗口过程在每个息到来时被调用一次HWND参数是息相应的窗口的句柄这很重要因为你可能用相同的类创建了两个或多个窗口并且它们用相同的窗口过程(WndProc())不同点就在不同的窗口有不同的hwnd参数比如我们得到WM_CLOSE消息我们就要销毀那个窗口我们使用了窗口句柄作为我们得到的第一个参数其它的窗口都不会受影响除了那个我们想要操作的之外

  WM_CLOSE是在我们按下关闭按钮或按下Alt+F4组合时产生的这默认会使窗口销毀但我喜欢显式处理它因为这是在程序退出之前做清除检查或询问用戶是否保存文件等事情的绝佳的位置

  当我们调用DestoryWindow()系统向要销毀的窗口送出WM_DESTORY消息这里是我们的窗口并在从系统移除我们的窗口之前删除它剩下的所有的子窗口因为这是我们的程序中唯一的窗口我们準备好了并希望程序退出所以我们调用了PostQuitMessage()这样会向消息循环发出WM_QUIT消息我们不永远收不到这个消息因为它使GetMessage()返回FALSE而且你也可以看到我们的消息循环代码中这时候我们停止处理息并返回最终的结果码我们传递给PostQuitMessage()WM_QUIT中的wParam部分这个返回值有在你的编程为被別的程序调用并且你需要一个确定的返回值时候才有真正有用

 

4.C语言宏的用法

   

 #include <stdio.h>

#define PRINT1(a,b)        \
    {                  \
      printf("print a\n"); \
      printf("print b\n"); \
    }

#define      PRINT2(a, b)      \
  do{               \
      printf("print a\n"); \
      printf("print b\n"); \
    }while(0)

#define PRINT(a) \
    do{\
    printf("%s: %d\n",#a,a);\
    printf("%d: %d\n",a,a);\
    }while(0)

#define TYPE1(type,name)   type name_##type##_type
#define TYPE2(type,name)   type name##_##type##_type

#define ERROR_LOG(module)   fprintf(stderr,"error: "#module"\n")

 main()
{
    int a = 20;
    int b = 19;
    TYPE1(int, c);
    ERROR_LOG("add");
    name_int_type = a;
    TYPE2(int, d);
    d_int_type = a;

    PRINT(a);
    if (a > b)
    {
    PRINT1(a, b);
    }
    else
    {
    PRINT2(a, b);
    }
    return 0;
}

 

0 0