Windows API Chapter1
2016-01-06 10:51
288 查看
随着新程序的启动运行和早先启动的程序运行结束,内存被截成零七八碎的,操作系统必须能够把空闲的内存空间重新整合起来,这就要求系统吧内存中的程序块和数据块搬来搬去
Windows自己带一种图形编程语言GDI用来方便的显示图形和格式化文本
程序入口WinMain函数原型
WinMain的第一个参数一般叫做”实例句柄”,可以理解为指向当前对象的指针,在Windows中句柄就是一个数值,WinMain的第二个参数也是早期版本遗留下来的产物,标识是否有其他实例正在运行,在32位Windows中,这一概念已不在采用,因此WinMain的第二个参数始终都是0,WinMain的第三个参数表示的是命令行参数,不包含当前程序名称,类型被定义为PSTR,早期的版本中这个参数类型被定义为LPSTR, LPSTR和PSTR都是执行字符串的指针,LPSTR指的是长指针,他是16位Windows的产物,现在已经被遗弃,统一使用PSTR,WINAPI在WINDEF.h中定义,实际类型为__stdcall标识参数都是从右向左依次入栈
这种方式是默认的参数传递方式。WinMain的第四个参数用来志明程序最初如何显示:正常,最大化,最小化。
ASCII 美国国家信息交换标准码
C语言中的宽字节使用wchar_t类型来表示
在Windows编程中比较常用的一个宏定义就是
Windows编程其实就是对消息信息的处理过程。例如当使用者更改视窗的大小时,Windows给程式发送一个讯息支出新视窗的大小,然后程式就可以调整视窗中的内容以回应大小的变化,
Windows自己带一种图形编程语言GDI用来方便的显示图形和格式化文本
程序入口WinMain函数原型
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, PSTR szCmdLine, int iCmdShow)
WinMain的第一个参数一般叫做”实例句柄”,可以理解为指向当前对象的指针,在Windows中句柄就是一个数值,WinMain的第二个参数也是早期版本遗留下来的产物,标识是否有其他实例正在运行,在32位Windows中,这一概念已不在采用,因此WinMain的第二个参数始终都是0,WinMain的第三个参数表示的是命令行参数,不包含当前程序名称,类型被定义为PSTR,早期的版本中这个参数类型被定义为LPSTR, LPSTR和PSTR都是执行字符串的指针,LPSTR指的是长指针,他是16位Windows的产物,现在已经被遗弃,统一使用PSTR,WINAPI在WINDEF.h中定义,实际类型为__stdcall标识参数都是从右向左依次入栈
这种方式是默认的参数传递方式。WinMain的第四个参数用来志明程序最初如何显示:正常,最大化,最小化。
ASCII 美国国家信息交换标准码
C语言中的宽字节使用wchar_t类型来表示
#include <wchar.h> #include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { wchar_t c = 'A'; wchar_t *cc = L"HELLO!"; wchar_t ccc[] = L"HELLO!"; printf("%d\n", sizeof(c)); printf("%d\n", sizeof(ccc)); printf("%d\n", strlen(cc)); printf("%d\n", wcslen(cc)); } 输出结果 4,28, 1, 6
在Windows编程中比较常用的一个宏定义就是
#define __T(x) L##x这个宏定义实现的具体操作是将L和x的实际内容粘连到一块,##是粘连操作符. 例如__T(“Hello”)实际的效果即 L“Hello”
Windows编程其实就是对消息信息的处理过程。例如当使用者更改视窗的大小时,Windows给程式发送一个讯息支出新视窗的大小,然后程式就可以调整视窗中的内容以回应大小的变化,
#include <windows.h> /* LRESULT 长整形 CALLBACK __stdcall 指定参数从右向左一次入栈,默认的参数入栈方式 HWND 窗口句柄 UINT 无符号整形 WPARAM LPARAM16位Windows遗留下的产物,32位Windows中这两个长度相同,指的是消息参数 消息的组成:一个消息由一个消息名称(UINT),和两个参数(WPARAM,LPARAM)。 当用户进行了输入或是窗口的状态发生改变时系统都会发送消息到某一个窗口。 */ LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //声明窗口过程 /* TEXT 是一个宏,当字符串是宽字符时,会自动粘连一个“L” cbClsExtra 和 cbWndExtra 两者都是附加额外空间来存放窗口额外信息,cbClsExtra是对类的 这里所说的类不是C++中的类,而是WNDCLASS结构的变量用REgisterClass注册后,在系统中记录的一组信息 是窗口的一个模板,用该类生成的所有窗口共享该附加控件,类似C++中的static变量 cbWndExtra是对窗口的,没实例化一个窗口都有这么一个附加控件,类似C++类中的成员变量 HICON LoadIcon(HINSTANCE hInstance,LPCTSTR lpIconName); 该函数从与hInstance模块相关联的可执行文件中装入lpIconName指定的图标资源,仅当图标资源还没有被装入时该函数才执行装入操作,否则只获取装入的资源句柄 参数说明:lpIconName是指向NULL字符结尾的字符串的指针,它包含图标名.如果要使用windows预定义的图标,这是hInstance必须设置成NULL HCURSOR LOADCURSOR(HINSTANCE HINSTANCE, LPCTSTR LPCURSORNAME) HINSTANCE 确定的一个实例模块的可执行文件中包含的光标移动到载入。 PCURSORNAME 以NULL终结的字符串包含的名称,光标资源载入 如果函数成功,返回值是处理的新加载的光标。如果函数失败,返回值为NULL GetStockObject函数的功能就是获得一个系统库存的画笔或者画刷或者模版的一个句柄。 */ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR SzCmdLine, int iCmdShow) { MSG msg; //消息结构体 //设置窗口辩题 static TCHAR szAppName[] = TEXT("世界你好"); //设置窗口属性 WNDCLASS wndclass; //定义一个窗口类, 下面对窗口类的属性进行设置 wndclass.style = CS_HREDRAW | CS_VREDRAW; //设置窗口样式 wndclass.lpfnWndProc = WndProc; //注册窗口过程函数 wndclass.cbClsExtra = 0; //类附加空间设置为0 wndclass.cbWndExtra = 0; //窗口附加空间设置为0 wndclass.hInstance = hInstance; //指定窗口实例 wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); //设置窗口图标 wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); //设置鼠标格式 wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; //设置窗口菜单 wndclass.lpszClassName = szAppName; //设置窗口名称 RegisterClass(&wndclass); //注册窗口 //HWND窗口代号 HWND hwnd = CreateWindow(szAppName, TEXT("HELLO"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance, NULL); ShowWindow(hwnd, iCmdShow); UpdateWindow(hwnd); //GetMessage第二三四个参数设置为NULL和0标识程序接收他自己建立的所有视窗的所有消息 while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } } LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; //HDC获取设备环境句柄,如显示器或打印机。 PAINTSTRUCT ps; //记录窗口的绘制信息,即绘制信息结构体 RECT rect; //rect是一个矩形结构 switch (message) { case WM_PAINT: hdc = BeginPaint(hwnd, &ps); GetClientRect(hwnd, &rect); DrawText(hdc, TEXT("aaa"), -1, &rect, DT_SINGLELINE); EndPaint(hwnd, &ps); return 0; //在消息处理完成之后必须返回0, 不返回0暂时也没有发现问题 case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); }
相关文章推荐
- 如何重装TCP/IP协议
- Windows 8 官方高清壁纸欣赏与下载
- 谁是桌面王者?Win PK Linux三大镇山之宝
- 对《大家都在点赞 Windows Terminal,我决定给你泼一盆冷水》一文的商榷
- Windows Clang开发环境备忘
- 从Windows系统下访问Linux分区相关软件
- 对《大家都在点赞 Windows Terminal,我决定给你泼一盆冷水》一文的商榷
- Windows下搭建本地SVN服务器
- Visual Studio 2012 示例代码浏览器 - 数以千计的开发示例近在手边,唾手可得
- Visual Studio 2012 示例代码浏览器 - 数以千计的开发示例近在手边,唾手可得
- 微软镜像下载
- windows server域用户提升到本地更高权限组中的方法
- 使用命令修改注册表键值及权限
- 通过手机、电脑远程开关机,Windows和linux机手机,电脑相互控制
- Windows XP最新应用技巧大荟萃
- Windows 系统组策略应用全攻略(上)第1/2页
- VBS脚本写的Windows硬件检测工具分享