VC++实用Win32模板:空程序和一个按钮两个文本框的对话框程序
acmilan2016/06/17软件综合 IP:四川

虽然C#更好用,但是有时候想用WinAPI却不知道它的特性是什么,或者是想查找一下WinAPI相关结构和常量的定义,这时还是要用到VC++。

使用WinAPI最好还是在GUI程序中进行,DOS窗口和WinAPI交互要考虑的东西太多,显示效果也太差(经常出现问号方框之类的)。

一般来说,最简单GUI程序就是只有WinMain的程序了,新建一个空Win32工程(不要默认,否则它会新建一个非常复杂的示例程序,还会开启预编译头文件):

w32.png

然后在工程里面添加一个CPP文件,按照下面的程序写即可:

<code class="language-cpp">#ifndef UNICODE
#define UNICODE
#endif

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
{
    // 在这里写程序
    MessageBox(NULL, L"我要退出", L"消息", MB_OK);
    return 0;
}
</windows.h></code>

也可以命令行编译:

<code class="language-bat">cl w32.cpp kernel32.lib user32.lib
</code>

这种程序与用户交互一般只有使用MessageBox,有时候不够用,我们就要新建一个自定义对话框,下面的程序模板包含一个按钮和两个对话框,还包括文本的I/O支持。

txtdlg.png

除了这个模板以外,如果你是在使用Community或商业版,还可以有其它的方便的途径,比如选择新建一个MFC对话框程序,然后拖一个按钮两个文本框,设置好属性以后双击文本框写程序就OK了。

RC文件(资源脚本,可以自己用VC++资源编辑器生成):

<code class="language-rc">#include <windows.h>

#define IDD_DIALOG1                     101
#define IDC_BUTTON1                     1001
#define IDC_EDIT1                       1002
#define IDC_EDIT2                       1003

IDD_DIALOG1 DIALOGEX 0, 0, 221, 137
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    PUSHBUTTON      "Button1",IDC_BUTTON1,7,7,50,14
    EDITTEXT        IDC_EDIT1,7,28,99,102,ES_MULTILINE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_VSCROLL
    EDITTEXT        IDC_EDIT2,114,28,100,102,ES_MULTILINE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_VSCROLL
END
</windows.h></code>

CPP文件(源代码文件):

<code class="language-cpp">#ifndef UNICODE
#define UNICODE
#endif

#include <windows.h>
#include <commctrl.h>

// 如果包含了resource.h就不用手动指定资源序号了
//#include "resource.h"
#define IDD_DIALOG1                     101
#define IDC_BUTTON1                     1001
#define IDC_EDIT1                       1002
#define IDC_EDIT2                       1003

HINSTANCE hMainInst;

TCHAR *input; // 自动保存的输入字符串
int inputlen; // 输入字符串的长度

// 输出字符串的函数
void OutputText(HWND hdlg, TCHAR *str)
{
	SendDlgItemMessage(hdlg, IDC_EDIT2, EM_SETSEL, -1, -1);
	SendDlgItemMessage(hdlg, IDC_EDIT2, EM_REPLACESEL, 0, (LPARAM)str);
}

void OnButton1(HWND hdlg)
{
	// TODO: 程序逻辑
	OutputText(hdlg, L"我是输出的字符串\r\n");
	OutputText(hdlg, input);
	OutputText(hdlg, L"\r\n");
	return;
}

BOOL CALLBACK DlgProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
	case WM_INITDIALOG:
		break;
	case WM_CLOSE:
		EndDialog(hdlg, 0);
		return TRUE;
	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case IDC_BUTTON1:
			inputlen = (int)SendDlgItemMessage(hdlg, IDC_EDIT1, WM_GETTEXTLENGTH, 0, 0);
			input = (TCHAR*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (inputlen + 1) * sizeof(TCHAR));
			GetDlgItemText(hdlg, IDC_EDIT1, input, inputlen + 1);
			OnButton1(hdlg);
			HeapFree(GetProcessHeap(), 0, input);
			return TRUE;
		}
		break;
	}
	return FALSE;
}

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nShowCmd)
{
	hMainInst = hInst;
	return (int)DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)DlgProc);
}
</commctrl.h></windows.h></code>

命令行编译:

<code class="language-bat">rc mydlg1.rc
cl mydlg1.cpp mydlg1.res kernel32.lib user32.lib
</code>

[修改于 7年11个月前 - 2016/06/17 18:05:28]

来自:计算机科学 / 软件综合
1
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
acmilan 作者
7年11个月前 修改于 7年11个月前 IP:四川
821870

如果是C#程序的话,也可以用这种方法移植控制台程序

<code class="language-cs">StringReader cin = new StringReader(textBox1.Text);
StringWriter cout = new StringWriter();

// 将Console.Read(Line)替换为cin.Read(Line)
// 将Console.Write(Line)替换为cout.Write(Line)
cout.WriteLine(cin.ReadLine());

textBox2.Text += cout.ToString();
</code>

更方便的做法,把cout直接命名为Console,这样只需要改Read/ReadLine的前缀就行了:

<code class="language-cs">StringReader cin = new StringReader(textBox1.Text);
StringWriter Console = new StringWriter();

// 将Console.Read(Line)替换为cin.Read(Line)
Console.WriteLine(cin.ReadLine());

textBox2.Text += Console.ToString();
</code>

如果需要实时更新输出的话,需要新建一个线程并使用Invoke进行更新,此处不再作介绍,感兴趣的同学可以自己研究一下。

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
acmilan
进士 学者 笔友
文章
461
回复
2934
学术分
4
2009/05/30注册,5年3个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}