您的位置:首页 > 其它

Windows API Chapter1

2016-01-06 10:51 288 查看
随着新程序的启动运行和早先启动的程序运行结束,内存被截成零七八碎的,操作系统必须能够把空闲的内存空间重新整合起来,这就要求系统吧内存中的程序块和数据块搬来搬去

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  windows