Windows SDK 教程(一)创建简单的Dialog窗口

茵蒂克丝

windows 编程入口函数


#include <window.h> // 引用windows编程所需的头文件

int WINAPI WinMain(
	HINSTANCE hInstance, 		// 当前实例的句柄		
	HINSTANCE hPrevInstance,	// 父级示例的句柄
	LPSTR lpCmdLine, 			// 获取CMD传入的命令行参数
	int nCmdShow)				// 窗口显示方式
{
	/* 代码 */
	return 0; // 程序返回
}

更多信息可以直接百度 WinMain

hello world 的日常

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
	MessageBox(NULL, TEXT("hello world"), TEXT("标题"), MB_OK);
	return 0;
}

MessageBox 第一个参数是父窗口的句柄,这里没有父窗口就写一个NULL
第二和第三个参数分别是 消息盒子(MessageBox) 的内容和标题
第四个参数是选项的类型:如 MB_OK 就只有一个【确定】按钮,如果换成 MB_OKCANCEL 则有【确定】和【取消】两个选项,更多类型请直接百度 MessageBox

DialogBox 函数创建窗口

【资源文件】 -> 【添加】 -> 【新建项】 -> 选择【资源文件(.rc)】接着输入名称按【确定】

接着找到【资源视图】->其中【右键】->【添加资源】-> 选中【Dialog】->单击【新建】

就创建好了,现在可以使用资源编辑器来编辑图形界面了

int DialogBox(
	HINSTANCE hInstance,	// 指向模块的句柄
	LPCTSTRlp Template,		// 指向模板的的字符串指针
	HWND hWndParent,		// 父窗口句柄
	DLGPROC lpDialogFunc	// 窗口过程函数
);
#include <windows.h>
#include "resource.h" // 注意引用资源文件的头文件

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
	DialogBox(
		hInstance, 	// 程序实例句柄
		MAKEINTRESOURCE(IDD_MAIN), // 获取窗口模板
		NULL,		// 父进程的ID
		NULL		// 窗口过程处理函数
	);

	return 0;
}

Dialog 窗口处理函数


#include <windows.h>
#include "resource.h"

BOOL CALLBACK DialogProc(
	HWND hwnd, 		// 当前窗口句柄
	UINT Message, 	// 收到的windows消息ID
	WPARAM wParam,	// 消息参数1
	LPARAM lParam)	// 消息参数2
{

	return 0;
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
	DialogBox(
		hInstance, 
		MAKEINTRESOURCE(IDD_MAIN),
		NULL,
		DialogProc
	);

	return 0;
}

关于窗口消息的处理函数,主要就分为三个部分,一个是窗口自身的句柄 hwnd (handle for window) 一个是从操作系统接收到的 Message (消息) 还有一部分就是 消息的内容 (wParam 和 lParam)

由于我们的窗口处理过程,没有处理任何消息,所以目前我们的Dialog窗口还不能做任何事情,就连点击关闭都不能,因为没有处理。

处理窗口关闭消息


#include <windows.h>
#include "resource.h"

BOOL CALLBACK DialogProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
	// 根据当前windows传入的消息来进行不同程的处理
	switch(Message)
	{
		// CLOSE 关闭消息
		case WM_CLOSE:				
			DestroyWindow(hwnd); // 关闭当前窗口
		break;
	}
	return 0;
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
	DialogBox(
		hInstance, 
		MAKEINTRESOURCE(IDD_MAIN),
		NULL,
		DialogProc
	);

	return 0;
}

处理按钮点击消息


#include <windows.h>
#include "resource.h"

BOOL CALLBACK DialogProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
	switch(Message)
	{
		case WM_COMMAND:
			// MessageBox(NULL, TEXT("WM_COMMAND 消息收到!"), TEXT("Title"), MB_OK);
			switch(wParam)
			{
				case IDOK:
					MessageBox(NULL, TEXT("OK按键被按下!"), TEXT("标题"), MB_OK);
				break;
				case IDCANCEL:
					MessageBox(NULL, TEXT("取消被按下!"), TEXT("标题"), MB_OK);
				break;
			}
		break;
			// CLOSE 关闭
		case WM_CLOSE:				
			DestroyWindow(hwnd);
		break;
	}
	return 0;
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
	DialogBox(
		hInstance, 
		MAKEINTRESOURCE(IDD_MAIN),
		NULL,
		DialogProc
	);

	return 0;
}

文章索引百度网盘
下一讲:Windows SDK 教程(二)简单的计算器

Advertisements

5 thoughts on “Windows SDK 教程(一)创建简单的Dialog窗口

  1. 如果牵扯到数据交换呢?比如按下确认的时候就要对对话框里面某个选项框判断,又或者某个文本框的内容读取…

  2. 处理窗口关闭消息中,对于DialogBox出来的对话框窗口,貌似不能用DestroyWindow来结束他的运行,只能用
    EndDialogBox 

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

You are commenting using your WordPress.com account. Log Out /  更改 )

Google+ photo

You are commenting using your Google+ account. Log Out /  更改 )

Twitter picture

You are commenting using your Twitter account. Log Out /  更改 )

Facebook photo

You are commenting using your Facebook account. Log Out /  更改 )

Connecting to %s