第一个手写Win32窗口程序
第一个手写Win32窗口程序
一 Windows编程基础
1 Win32应用程序的基本类型
1.1 控制台程序
不需要完善的Windows窗口,可以使用DOS窗口
的方式显示。
1.2 Win32窗口程序
包含窗口的程序。可以通过窗口与程序进行交互。
1.3 Win32库程序
提供已有的代码,供其他程序使用。
动态库:DLL 是在执行的时候可以加载的程序。
静态库:LIB 是在编译链接是使用的程序。
1.4 对比
1.4.1 程序的入口函数不同
控制台:main
Win32窗口程序:WinMain
动态库DLL:DllMain
静态库LIB:无
1.4.2 编译链接后存在的形式不同
控制台和Win32窗口程序:EXE文件,可以执行
动态库DLL:DLL文件,无法执行
静态库LIB:LIB文件,无法执行
1.4.3 执行结果不同
控制台:使用DOS窗口,自己没有窗口。
Win32窗口程序:会产生自己的窗口,
可以将结果输出或者从窗口接受输入。
动态库DLL:自己无法执行,提供可以执行
的代码,当EXE等程序执行时,可以使用
这些代码.执行时,该库必须在指定的路径.
静态库LIB: 自己无法执行,提供给程序在
编译链接时使用,将库中的代码嵌入到
程序当中.执行时,不需要该库存在.
二 Win32窗口程序和编译环境
2.1 开发和编译环境
VC1.5 - VC6.0(2008) - VC10.0(2010)
2.1.1 编译器 CL.EXE(在VC安装目录的VC98/Bin目录下)
将原代码编译目标代码. OBJ文件.
2.1.2 链接器 Link.EXE(在VC安装目录的VC98/Bin目录下)
将OBJ文件和库函数链接.生成EXE.
2.1.3 资源编译器 rc.exe(在VC安装目录的MSDev98\Bin目录下)
将资源脚本编译成可以链接的文件(RES).
2.2 头文件和库
2.2.1 头文件 windows.h包含了windows
常用的定义等.其他,还包含了一些其他的
头文件:
windef.h - 定义了各种的数据类型
winbase.h- 定义了kernel的相关函数
wingdi.h - 定义了绘图和文字
winuser.h- 窗口 控件等函数
winnt.h - 提供Unicode支持
2.2.2 库
kernel32.lib - 提供进程/线程/内存等等
API函数支持
user32.lib - 包括窗户/界面等等.
gdi32.lib - 提供绘图/文字等。
2.3 Hello World程序
2.3.1 入口函数
int WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR pszCmdLine,
int nShowCmd )
hInstance - 应用程序的实例句柄
hPrevInstance - 该应用程序的前一个实例句柄
pszCmdLine - 命令行参数
nShowCmd - 窗口的显示方式
2.3.2 MessageBox
2.4 编译环境的准备
在VC98的BIN目录下VCVARS32.BAT
2.5 编译CL.EXE
CL的常用选项
/c 只编译不链接
/TC 编译C文件
/TP 编译C++文件
如果不指定,CL会根据文件类型自动区分
/I 头文件所在路径
字符大小写敏感
2.6 链接LINK.EXE
LINK常用选项:
/out:文件名,链接成指定文件名的程序
/LIBPATH:LIB文件存放的路径, /LIBPATH:"E:\XXX"
/SUBSYSTEM: CONSOLE/WINDOW
字符大小写不敏感
2.7 执行
正常执行或带参数执行
三 第一个窗口程序
3.1 入口函数WinMain
3.2 窗口处理函数
当窗口处理消息事件时,系统调用该函数
LRESULT CALLBACK WindowProc(
HWND hwnd, // 窗口的句柄
UINT uMsg, // 消息的ID号
WPARAM wParam, // 消息所对应的参数
LPARAM lParam // 消息所对应的参数
);
3.3 注册窗口类型
typedef struct _WNDCLASS {
UINT style; //窗口类的风格
WNDPROC lpfnWndProc; //窗口处理函数
int cbClsExtra; //窗口类附加数据大小
int cbWndExtra; //窗口附加数据大小
HANDLE hInstance; //当前应用程序的实例句柄
HICON hIcon; //窗口图标
HCURSOR hCursor; //窗口的鼠标
HBRUSH hbrBackground; //窗口的背景画刷
LPCTSTR lpszMenuName; //菜单
LPCTSTR lpszClassName; //类型名称
} WNDCLASS;
注册函数 RegisterClass
3.4 创建窗口
HWND CreateWindow(
LPCTSTR lpClassName, //窗口类型名称
LPCTSTR lpWindowName, //窗口名称
DWORD dwStyle, //窗口类型
int x, //窗口的左上角X坐边
int y, //窗口的左上角X坐边
int nWidth, //窗口的宽度
int nHeight, //窗口的高度
HWND hWndParent, //父窗口句柄
HMENU hMenu, //窗口菜单句柄
HANDLE hInstance, //应用程序的实例句柄
LPVOID lpParam //创建的参数,一般为NULL
);
3.5 显示窗口
ShowWindow 显示窗口
BOOL ShowWindow(
HWND hWnd, //显示的窗口句柄
int nCmdShow //显示的方式
);
UpdateWindow 刷新窗口
3.6 消息处理
GetMessage 获取消息
DispatchMessage 派发消息
3.7 程序退出
窗口销毁时,退出程序。在WndProc中实现。
WM_DESTROY: 当窗口销毁时,会调用WndProc
传递给使用者。
PostQuitMessage:发送一个退出消息。
四 资源的处理
4.1 资源和资源脚本
资源:ICON/CUSRUR/BITMAP/MENU......
资源脚本: 扩展名为rc文件。
4.2 编译资源
使用rc.exe编译资源,生成RES文件
4.3 链接资源
使用link.exe将RES文件链接到程序当中
4.4 ICON的使用
LoadIcon从指定程序中加载ICON资源。
HelloWorld.c代码如下:
#include <windows.h> // 2、窗口过程函数
LRESULT CALLBACK WindowProc( HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam )
{
//判断消息ID
switch (uMsg)
{
case WM_DESTROY: // 窗口销毁消息
PostQuitMessage( ); // 发送退出消息
return ;
}
// 其他的消息调用缺省的消息处理程序
return DefWindowProc( hwnd, uMsg, wParam, lParam );
} // 3、注册窗口类型
BOOL RegisterWindow( LPCSTR lpcWndName, HINSTANCE hInstance )
{
ATOM nAtom = ; // 构造创建窗口参数
WNDCLASS wndClass = { }; wndClass.style = CS_HREDRAW | CS_VREDRAW;
wndClass.lpfnWndProc = WindowProc; // 指向窗口过程函数
wndClass.cbClsExtra = ;
wndClass.cbWndExtra = ;
wndClass.hInstance = hInstance;
wndClass.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE( ) );// 100为在HelloWorld.rc文件中定义的ID号
wndClass.hCursor = NULL;
wndClass.hbrBackground = (HBRUSH)COLOR_GRAYTEXT;
wndClass.lpszMenuName = NULL;
wndClass.lpszClassName = lpcWndName; // 注册的窗口名称,并非标题,以后创建窗口根据此注册的名称创建 nAtom = RegisterClass( &wndClass );
if( == nAtom)
{
MessageBox( NULL, "Register Failed",
"Error", MB_OK|MB_ICONERROR );
return FALSE;
}
else
{
MessageBox( NULL, "Register Successed",
"Sucessed", MB_OK );
}
return TRUE;
} // 4、创建窗口(lpClassName 一定是已经注册过的窗口类型)
HWND CreateMyWindow( LPCTSTR lpClassName, HINSTANCE hInstance )
{
HWND hWnd = NULL;
// 创建窗口
hWnd = CreateWindow( lpClassName, "Hello World",
WS_OVERLAPPEDWINDOW,
, , , ,
NULL, NULL, hInstance, NULL );
if( NULL == hWnd )
{
MessageBox( NULL, "Create Window Failed",
"Error", MB_OK|MB_ICONERROR );
return NULL;
}
else
{
MessageBox( NULL, "Create Window Successed",
"Sucessed", MB_OK );
}
return hWnd;
} // 5、 显示窗口
void DisplayMyWnd( HWND hWnd )
{
ShowWindow( hWnd, SW_SHOW );
UpdateWindow( hWnd );
} void doMessage() // 消息循环处理函数
{
MSG msg = { };
// 获取消息
while( GetMessage( &msg, NULL, , ) ) // 当接收到WM_QIUT消息时,GetMessage函数返回0,结束循环
{
DispatchMessage( &msg ); // 派发消息,到WindowPro函数处理
}
} // 1、 入口函数
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPWSTR lpCmdLine,
int nShowCmd )
{
HWND hWnd = NULL;
LPCTSTR lpClassName = "MyWnd"; // 注册窗口的名称
RegisterWindow( lpClassName, hInstance );
hWnd = CreateMyWindow( lpClassName, hInstance ); DisplayMyWnd( hWnd );
doMessage(); return ;
}
HelloWorld.rc资源脚本如下:
其中 100:表示资源的ID号
ICON:表示资源的类型
”resources/ICO.ico“ 表示资源Ico图标的路径
ICON "resources/ICO.ico"
运行方法:(首先运行VC98/bin/VCVARS32.bat配置好运行环境)
1、在Cmd控制台中找到代码当前路径,使用CL HelloWorld.c /c 命令只编译不链接文件,会生成一个HelloWorld.obj的目标文件
2、使用 rc HelloWorld.rc 命令编译HelloWorld.rc 资源脚本文件,会生成一个HelloWorld.RES的编译过的资源脚本文件
3、使用 link HelloWorld.obj user32.lib HelloWorld.res 链接这几个文件,会生成一个带图标的HelloWorld.exe文件
4、可以在 cmd 窗口中继续使用 HelloWorld 命令运行该程序,也可以点击生成的HelloWorld.exe运行改程序
运行结果如下:
(1) (2)
(3)可以看到左上角的图标也改变了
第一个手写Win32窗口程序的更多相关文章
- 深度学习---手写字体识别程序分析(python)
我想大部分程序员的第一个程序应该都是“hello world”,在深度学习领域,这个“hello world”程序就是手写字体识别程序. 这次我们详细的分析下手写字体识别程序,从而可以对深度学习建立一 ...
- WIN32窗口程序
// Win32.cpp : 定义应用程序的入口点. // #include "stdafx.h" #include "Win32.h" void TRACE( ...
- win32窗口程序分析
1.分析消息的附加参数 例如:为了查看程序处理了哪些消息 在回调函数中调用输出函数,在控制台中输出消息的值:
- 手写一个Java程序输出HelloWorld
` 创建一个Hello.java文件使用记事本打开 public class Hello{ public static void main(String [] args){ System.out.pr ...
- 手写PE文件(二)
[文章标题]: 纯手工编写的PE可执行程序 [文章作者]: Kinney [作者邮箱]: mohen_ng@sina.cn [下载地址]: 自己搜索下载 [使用工具]: C32 [操作平台]: win ...
- 32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数
32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数 (如果想看所有代码,请下载课堂资料,里面有所有代码,这里会讲解怎么生成一个窗口程序) 一丶32位汇编编写Windows窗口程序 首 ...
- 利用神经网络算法的C#手写数字识别
欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 下载Demo - 2.77 MB (原始地址):handwritten_character_recognition.zip 下载源码 - 70. ...
- 利用神经网络算法的C#手写数字识别(一)
利用神经网络算法的C#手写数字识别 转发来自云加社区,用于学习机器学习与神经网络 欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 下载Demo - 2.77 MB (原始地址):handwri ...
- 深度学习之 mnist 手写数字识别
深度学习之 mnist 手写数字识别 开始学习深度学习,先来一个手写数字的程序 import numpy as np import os import codecs import torch from ...
随机推荐
- NOI.AC NOIP模拟赛 第五场 游记
NOI.AC NOIP模拟赛 第五场 游记 count 题目大意: 长度为\(n+1(n\le10^5)\)的序列\(A\),其中的每个数都是不大于\(n\)的正整数,且\(n\)以内每个正整数至少出 ...
- BZOJ3459 : Bomb
二分答案,转化成判定所有科学家能否在lim时间内走到安全的地方 考虑网络流,对于每个非叶子节点,S向它连边,容量为该点科学家的人数 对于每个叶子节点,向T连边,容量为该点的容量 对于每个非叶子节点x, ...
- linux和mac
整理下来的linux常用指令 mount [-t 文件系统] 设备文件名 挂载点挂载命令,一般用于在挂载ISO,或者其他比如U盘等设备时使用,[-t iso9660]为固定格式,可写可不写,非必写项. ...
- ROS知识(21)----ROS C++代码格式化
这里提供两种方法. 第一种方法:clang_format 1.安装clang format sudo apt-get install -y clang-format-3.6 2.从github的ros ...
- 使用git pull文件时和本地文件冲突怎么办
在使用git pull代码时,经常会碰到有冲突的情况,提示如下信息:error: Your local changes to 'c/environ.c' would be overwritten by ...
- TVB三个台
翡翠台http://token.tvb.com/stream/live/hls/mobilehd_jade.smil 高清翡翠,http://token.tvb.com/stream/live/hls ...
- C#面向服务WebService从入门到精通
<C#面向服务WebService从入门到精通>包含以下两个部分: 一.<C#远程调用技术WebService修炼手册[基础篇]>本次分享课您将学习到以下干货知识点:1).We ...
- Delphi 完全时尚手册之 Visual Style 篇 (界面不错) 转自http://blog.csdn.net/iseekcode/article/details/4733229
这里先说说两个概念:Theme(主题)和 Visual Style .Theme 最早出现在 Microsoft Plus! for Windows 95 中,是 Windows 中 Wallpape ...
- NSNotificationCenter消息注册与撤销
苹果的消息机制是个非常好用的东西,当需要在类的各个实例之间传递消息或者写一些事件驱动的程序时,绝对是个不错的工具.但是使用时一不小心就会造成引用已经被dealloc的对象的错误,引起程序崩溃.于是,在 ...
- 分享一段ios数据库代码,包括对表的创建、升级、增删查改
分享一段ios数据库代码.包括创建.升级.增删查改. 里面的那些类不必细究,主要是数据库的代码100%可用. 数据库升级部分,使用switch,没有break,低版本一次向高版本修改. // DB.h ...