初学windows程序设计

来源:互联网 发布:若非吾故人乎意思 编辑:程序博客网 时间:2024/05/21 03:18

     在windows环境下用VC++进行可视化的程序设计,需要了解windows的消息机制。我们编写的程序的目的其实就是响应windows传递给我们的程序的消息。想要了解windows的内部运行机制需要整整一本书的容量,想要学好windows程序设计必须掌握好消息机制。下面是一个简单的windows程序,它只处理了几个简单的消息。

/*---------------------------------------------------
   WinMain.c  -- Windows programs Demo Program No. 1
                 (c) sixing, 2012.7.12
  ---------------------------------------------------*/

#include <windows.h>
#include <stdio.h>

LRESULT CALLBACK WinSunProc(//回调函数的声明
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
);

int WINAPI WinMain(//程序的入口函数,和main一样的效果
  HINSTANCE hInstance,      // handle to current instance
  HINSTANCE hPrevInstance,  // handle to previous instance
  LPSTR lpCmdLine,          // command line
  int nCmdShow              // show state
)
{
 WNDCLASS wndcls;//窗口类型的结构体
 wndcls.cbClsExtra=0;
 wndcls.cbWndExtra=0;//两个额外的数值
 wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);//窗口客户区的颜色
 wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);//加载光标
 wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);//加载图标
 wndcls.hInstance=hInstance;//程序的实例
 wndcls.lpfnWndProc=WinSunProc;//指向回调函数
 wndcls.lpszClassName="sixing";//窗口的名字
 wndcls.lpszMenuName=NULL;//指向要调用的菜单地址
 wndcls.style=CS_HREDRAW | CS_VREDRAW;//窗口的风格,发生水平和垂直改变时重新绘制窗口
 RegisterClass(&wndcls);//注册窗口

 HWND hwnd;//定义一个窗口句柄
 hwnd=CreateWindow("sixing","思行",WS_OVERLAPPEDWINDOW,//创建窗口
  0,0,600,400,NULL,NULL,hInstance,NULL);

 ShowWindow(hwnd,SW_SHOWNORMAL);//显示窗口,产生WM_CREATE消息
 UpdateWindow(hwnd);//更新窗口,会产生WM_PAINT消息

 MSG msg;//定义消息结构体
 while(GetMessage(&msg,NULL,0,0))//设定消息循环
 {
  TranslateMessage(&msg);//把消息进行转换,如把WM_KEYDOWN,WM_KEYUP转换成WM_CHAR消息
  DispatchMessage(&msg);//向应用程序投递消息
 }
 return 0;
}

LRESULT CALLBACK WinSunProc(//回调函数
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
)
{
 switch(uMsg)
 {
 case WM_CHAR://程序接受的键盘消息时显示按下键的ASCII码值
  TCHAR szChar[20];
  wsprintf(szChar,"char is %d",wParam);
  MessageBox(hwnd,szChar,"思行",0);
  break;
 case WM_LBUTTONDOWN://左键按下消息
  MessageBox(hwnd,"mouse clicked","思行",0);
  HDC hdc;
  hdc=GetDC(hwnd);//获取设备环境句柄,向客户区显示内容时
  TextOut(hdc,0,50,"努力学习软件设计技术",strlen("努力学习软件设计技术"));
  ReleaseDC(hwnd,hdc);//释放设备环境句柄,必须有
  break;
 case WM_PAINT://窗口重绘消息
  HDC hDC;
  PAINTSTRUCT ps;
  hDC=BeginPaint(hwnd,&ps);//获取设备环境句柄
  TextOut(hDC,0,0,"多抽出一分钟学习 生命更加精彩",strlen("多抽出一分钟学习 生命更加精彩"));
  EndPaint(hwnd,&ps);//释放设备环境句柄,必须有
  break;
 case WM_CLOSE://窗口关闭消息
  if(IDYES==MessageBox(hwnd,"是否真的结束?","weixin",MB_YESNO))
  {
   DestroyWindow(hwnd);//会产生销毁窗口的消息WM_DESTROY
  }
  break;
 case WM_DESTROY://窗口销毁消息
  PostQuitMessage(0);
  break;
 default://对于程序不关心的消息默认的归宿
  return DefWindowProc(hwnd,uMsg,wParam,lParam);
 }
 return 0;
}

 

由于时间限制,注释不是太详细,详见MSDN.

对于那些API函数不需要记忆,用时查看MSDN就行了,用的多了就会记住了。

当然MSDN都是英文的,要培养自己阅读英文技术文档的能力!