整型。
句柄—系统用来唯一标识某个Windows对象的一个无符号整数,相当于Windows对象的名字,应用程序只有通过句柄才能使用Windows对象。
(1)HWND
(2)HINSTANCE
(3)HDC
Windows常用句柄类型如下所示:
能触发程序作出相应反映的刺激叫做事件。例如键盘的输入,鼠标的单击或双击。
调用 ShowWindows 函数显示窗口,调用UpdateWindows函数更新窗口。
在创建了窗口的应用程序中,应用程序将要不断地从消息队列中获取消息,并将消息指派给指定的窗口处理函数来处理,然后再回来从消息队列中获取消息,这个不断重复的过程叫做消息循环。
注册窗口类,创建应用程序的窗口和建立消息循环
主函数和窗口函数都是Windows系统调用的函数;
主函数是应用程序启动后,系统首先调用的函数;
窗口函数是主函数在消息循环中获得消息并把消息发送给系统之后,有系统调用函数。
// he.cpp : Defines the entry point for the application.定义应用程序的入口点
//
#include "stdafx.h" //是预编译处理器把stdafx.h文件中的内容加载到程序中来。
#include "resource.h"// 定义应用程序的入口点
//
#define MAX_LOADSTRING 100 //定义最大加载字符串100
// Global Variables:全局变量
HINSTANCE hInst; // 当前实例
TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名
// Foward declarations of functions included in this code module:此代码模块中包含的函数的前向声明:
ATOM MyRegisterClass(HINSTANCE hInstance); // 注册窗口函数的声明
BOOL InitInstance(HINSTANCE, int); // 初始化实例的函数声明
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // 主窗口的回调函数
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM); // "关于"对话框的回调函数
// win32程序入口函数
int APIENTRY WinMain(HINSTANCE hInstance, //当前应用程序的实例句柄。
HINSTANCE hPrevInstance, // 应用程序的先前实例的句柄。
LPSTR lpCmdLine, //指向本程序命令行的指针
int nCmdShow) //应用程序窗口显示方式的标志
{
// TODO: Place code here. 在此放置代码。
MSG msg; // 定义消息结构体对象
HACCEL hAccelTable; // 定义加速键句柄变量
// Initialize global strings 初始化全局字符串
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); // 导入字符串资源
LoadString(hInstance, IDC_HE, szWindowClass, MAX_LOADSTRING); // 同上一句
MyRegisterClass(hInstance); // 调用注册窗口函数
// Perform application initialization: 执行应用程序初始化:
if (!InitInstance (hInstance, nCmdShow)) //调用初始化实例函数
{
return FALSE; //返回false
}
hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_HE); // 导入
// Main message loop: 主消息循环:
while (GetMessage(&msg, NULL, 0, 0)) // API函数(GetMessage),消息循环
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) //判断函数TranslateAccelerator 是否成功调用
{
TranslateMessage(&msg); // 转换为字符消息。再被寄送到调用线程的消息队列利
DispatchMessage(&msg); //调用消息发送API函数将消息发送给系统
}
}
return msg.wParam; //返回一条退出的消息
}
//
// FUNCTION: MyRegisterClass()
//
// PURPOSE: Registers the window class.
//
// COMMENTS:
//
// This function and its usage is only necessary if you want this code
// to be compatible with Win32 systems prior to the 'RegisterClassEx'
// function that was added to Windows 95. It is important to call this function
// so that the application will get 'well formed' small icons associated
// with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance) // 注册窗口函数,实际调用的api 是 RegisterClassEx
{
WNDCLASSEX wcex; // 声明变量
wcex.cbSize = sizeof(WNDCLASSEX); //WNDCLASSEX 的大小
wcex.style = CS_HREDRAW | CS_VREDRAW; // 从这个窗口类派生的窗口具有的风格
wcex.lpfnWndProc = (WNDPROC)WndProc; //窗口处理函数为指针
wcex.cbClsExtra = 0; //窗口类无扩展
wcex.cbWndExtra = 0; //窗口实例无扩展
wcex.hInstance = hInstance; //当前实例句柄
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_HE); ///图标的句柄
wcex.hCursor = LoadCursor(NULL, IDC_ARROW); //窗口采用箭头光标
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); //背景画刷的句柄
wcex.lpszMenuName = (LPCSTR)IDC_HE; //指向菜单的指针
wcex.lpszClassName = szWindowClass; //指向类名称的指针
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); //和窗口类关联的小图标
return RegisterClassEx(&wcex); //注册窗口类
}
//
// FUNCTION: InitInstance(HANDLE, int) 函数: InitInstance(HINSTANCE, int)
//
// PURPOSE: Saves instance handle and creates main window 目的: 保存实例句柄并创建主窗口
//
// COMMENTS:
//
// In this function, we save the instance handle in a global variable and
// create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) // 初始化实例函数,此函数功能是创建并显示窗口,
实际使用的api 是CreateWindow,,ShowWindow
{
HWND hWnd; //窗口句柄
hInst = hInstance; // Store instance handle in our global variable 将实例句柄存储在全局变量中
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); //创建
if (!hWnd) //判断窗口是否创建成功
{
return FALSE; //创建失败返回false
}
ShowWindow(hWnd, nCmdShow); //显示窗口
UpdateWindow(hWnd); //刷新窗口
return TRUE;
}
//
// FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
// PURPOSE: Processes messages for the main window.
//
// WM_COMMAND - process the application menu
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) //处理消息的窗口函数
{
int wmId, wmEvent; //循环变量
PAINTSTRUCT ps; // 定义绘图信息结构变量
HDC hdc; //定设备环境句柄
TCHAR szHello[MAX_LOADSTRING]; //
LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING); //
switch (message)
{
case WM_COMMAND: //响应两个按钮的按下消息。是从菜单选择一个索引、控件发送消息到父窗口、加速键被翻译时的消息,
wmId = LOWORD(wParam); // 取低字节,菜单,控件,加速键的ID
wmEvent = HIWORD(wParam); //;如果该消息是来自控件的,则处理和控制发出信息。否则,这个参数是无效的
// Parse the menu selections: 分析菜单选项
switch (wmId)
{
case IDM_ABOUT: //这个是响应ID为IDM_ABOUT的菜单,控件,或加速键消息
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); //对话框函数
break;
case IDM_EXIT: //控件退出消息
DestroyWindow(hWnd); //关闭窗口
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam); //这个函数是系统提供的一个窗口消息处理函数,
//使系统对用户的每个没有处理的消息进行默认处理,是任何发送到该窗口的消息均能得到合适的处理
}
break;
case WM_PAINT: //重画客户区消息
hdc = BeginPaint(hWnd, &ps); //获取重画的窗口的设备描述表句柄
// TODO: Add any drawing code here...在此处添加绘图码
RECT rt; //定义一个矩形类变量
GetClientRect(hWnd, &rt); // 该函数获取窗口客户区的大小
DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER); //在客户区中央输出
EndPaint(hWnd, &ps); //结束绘画
break;
case WM_DESTROY: //撤销窗口消息处理
PostQuitMessage(0); //产生退出消息WM_QUIT
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam); //其他转缺省窗口函数
}
return 0;
}
// Mesage handler for about box. About Box的消息回调函数
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG: //该状态下及以后对话框才能收到的消息,
//该状态表明对话框及其所有子控件都创建完毕了。这个状态在调用显示对话框的函数之前。
return TRUE;
case WM_COMMAND: //相应按钮的消息
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam)); //关闭对话框
return TRUE;
}
break;
}
return FALSE;
}
可能出现的问题:
运行VC时总出现
Linking…
LINK : fatal error LNK1104: cannot open file “Debug/xx.exe”
Error executing link.exe.
xx.exe - 1 error(s), 0 warning(s)
在C:/Program Files/Microsoft Visual Studio/projiects下是找不到你写的工程文件的,因为在这个目录下写东西是需要管理员权限的,所以系统才会报“cannot open file”的错误,解决的办法是关闭软件,然后以管理员权限运行该软件,这样就可以完美运行调试程序了。
补充:还有碰到工程所在的文件夹如果是只读属性,也会有同样的错误,需要去掉只读属性。
窗口句柄、窗口类的定义、注册窗口类、创建窗口、显示更新窗口。
创建、显示应用程序的窗口和建立消息循环。
继承CWinAPP类并需要重写该类的成员函数InitInstance。