《VC++深入详解—孙鑫》Lesson1—Windows窗口应用函数

一、编写一个Windows窗口应用函数

1、创建窗口 CreateWindow()函数

  • 具体的格式可以直接复制MSDN Library中的函数格式
  • 句柄很重要,类似指针,找到资源
  • 不会就查MSDN Library!!!

2、消息循环(操作系统--应用程序--消息队列的关系)

  • 操作系统接收应用程序的窗口消息,将其投放到消息队列中
  • 应用程序通过GetMessage()函数调用消息队列中的消息
  • 应用程序调用DispatchMessage,将消息传给操作系统
  • 系统利用WNDCLASS结构体中的lpfnWndProc成员保存的窗口过程函数的指针调用窗口过程函数,对消息进行处理

3、窗口过程函数 LRESULT CALLBACK WinSunProc()函数

(1)需要注意其中的VM_CLOSE和VM_DESTROY消息的区别

    • VM_CLOSE把窗口关了,但是其后台还在运行
    • VM_DESTROY把窗口关闭的同时,也关闭了后台的运行

(2)在处理VM_LBUTTONDOWN消息时,记得要释放DC,否则会造成内存泄露

(3)使用if语句做判断时,可以把常量写在前面(x=1,1=x会报错,1==x)

 

 二、代码

 

#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

);

 

//WinMain函数

int WINAPI WinMain(  

  HINSTANCE hInstance,      // handle to current instance

  HINSTANCE hPrevInstance,  // handle to previous instance

  LPSTR lpCmdLine,          // command line

  int nCmdShow              // show state

)

{

WNDCLASS wndclass;

wndclass.style=CS_HREDRAW | CS_VREDRAW;//窗口样式

wndclass.lpfnWndProc=WinSunProc;//函数指针,指向窗口函数过程,窗口过程函数是一个回调函数

wndclass.cbClsExtra=0;//附加值设为0

wndclass.cbWndExtra=0;//附加值设为0

wndclass.hInstance=hInstance;//指向包含窗口过程的程序的实例句柄

wndclass.hIcon=LoadIcon(NULL,IDI_ERROR);//图标

wndclass.hCursor=LoadCursor(NULL,IDC_CROSS);//光标

wndclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);//窗口的背景,需要做一个强制类型转换

wndclass.lpszClassName="Weixin2003";//指定菜单资源的名字

wndclass.lpszMenuName=NULL;//指定窗口类的名字

RegisterClass(&wndclass);//注册窗口类

 

//创建窗口,定义一个变量保存成功创建窗口后的句柄

HWND hwnd;

hwnd = CreateWindow("Weixin2003","XX大学",WS_OVERLAPPEDWINDOW,

0,0,600,400,NULL,NULL,hInstance,NULL);

 

//显示及刷新窗口

ShowWindow(hwnd,SW_SHOWNORMAL);

UpdateWindow(hwnd);

 

//定义消息结构体,开始消息循环

MSG msg;

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

{

TranslateMessage(&msg);//虚拟键消息转化为字符消息

DispatchMessage(&msg);//分派一个消息到窗口过程

 

}

return msg.wParam;

}

 

//编写窗口过程函数

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:

char szChar[20];

sprintf(szChar,"char is %d",wParam);

MessageBox(hwnd,szChar,"char",0);

break;

case WM_LBUTTONDOWN:

MessageBox(hwnd,"mouse clicked","weixin",0);

HDC hdc;

hdc=GetDC(hwnd);

TextOut(hdc,0,50,"编写一个WinMain窗口界面",strlen("编写一个WinMain窗口界面"));

ReleaseDC(hwnd,hdc);

break;

case WM_PAINT:

HDC hDC;

PAINTSTRUCT ps;

hDC=BeginPaint(hwnd,&ps);

TextOut(hDC,0,0,"VC++学习第一课",strlen("VC++学习第一课"));

EndPaint(hwnd,&ps);

break;

case WM_CLOSE:

if(IDYES==MessageBox(hwnd,"是否可以结束?","weixin",MB_YESNO))

{

DestroyWindow(hwnd);

}

break;

case WM_DESTROY:

PostQuitMessage(0);//GetMessage函数只有在收到WM_DESTROY消息时才返回0,此时结束消息循环

break;

default:

return DefWindowProc(hwnd,uMsg,wParam,lParam);

}

return 0;

}

 

posted @ 2020-10-06 15:18  白衣居士  阅读(373)  评论(0)    收藏  举报