复习上一次内容:
把前一次笔记中的代码,简写一下
#include <windows.h>
#include<tchar.h>
#include <stdio.h>
#include <strsafe.h>
VOID showerrormassage()
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |/* 分别为FORMAT_MESSAGE_ALLOCATE_BUFFER由函数分配输出缓冲区,
FORMAT_MESSAGE_FROM_SYSTEM表示程序将会在系统消息表资源中搜索所需消息,FORMAT_MESSAGE_IGNORE_INSERTS程序将会忽略搜索到消息中的插入序列。 */
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpMsgBuf,
0, NULL);
MessageBox(NULL, (LPCTSTR)lpMsgBuf, TEXT("Error"), MB_OK | MB_ICONINFORMATION);
LocalFree(lpMsgBuf);
}
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
TCHAR* lpCmdline, //命令行参数,LPSTR可能会变成Unicode
int nCmdShow) {
/*MessageBoxA(NULL, "hell word ", "asm", MB_YESNO);*/\
int res = MessageBoxW(NULL, L"hell unicode", L"asm", MB_YESNO);
if (res == 0) {
/* MessageBoxW(NULL, L"错误", L"asm", MB_OK);*/
showerrormassage();
return 0;
}
return 0;
}
图形窗口
目前很多软件,为了更加好看,所以有些没有窗口
扁平化设计,希望极简,还有效率更高
例如windows10的菜单
窗口有上下遮挡的关系,当窗口变小的时候窗口会显示出来(当然还有父子关系的窗口)
要一个窗口,我们应该需要设置窗口大小
我们还会给窗口设置屏幕坐标
窗口坐标
窗口坐标,子窗口以父窗口为坐标,不应该以屏幕为坐标
可以看spy++
我们可以看到桌面是所有窗口的父亲
窗口句柄
内核对象,你在系统建立的窗口一般油内核层记录
所以你创建的窗口,其实是内核层创建的,所以叫内核对象
内核对象保存信息
内核对象等价于》窗口等价于》句柄(索引)
当然还有权限之分
#include <windows.h>
#include<tchar.h>
#include <stdio.h>
#include <strsafe.h>
VOID showerrormassage()
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |/* 分别为FORMAT_MESSAGE_ALLOCATE_BUFFER由函数分配输出缓冲区,
FORMAT_MESSAGE_FROM_SYSTEM表示程序将会在系统消息表资源中搜索所需消息,FORMAT_MESSAGE_IGNORE_INSERTS程序将会忽略搜索到消息中的插入序列。 */
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpMsgBuf,
0, NULL);
MessageBox(NULL, (LPCTSTR)lpMsgBuf, TEXT("Error"), MB_OK | MB_ICONINFORMATION);
LocalFree(lpMsgBuf);
}
LRESULT CALLBACK WindowProc(HWND hwnd,//默认窗口过程处理
UINT uMsg,
WPARAM wParam,
LPARAM lParam
) {
if (uMsg == WM_CLOSE)
{
//向消息队列投递WM_QUTT消息
PostQuitMessage(0);
}
return DefWindowProc(hwnd,uMsg, wParam, lParam);
}
//图形界面,窗口
int WINAPI _tWinMain(HINSTANCE hInstance,//应用程序示例句柄
HINSTANCE hPrevInstance,//保留
TCHAR* lpCmdline, //命令行参数,LPSTR可能会变成Unicode
int nCmdShow) {//窗口显示方式
//比如我们启动这个窗口,最大化,最小化
/*MessageBoxA(NULL, "hell word ", "asm", MB_YESNO);*/\
//int res = MessageBoxW(NULL, L"hell unicode", L"asm", MB_YESNO);
//
//if (res == 0) {
///* MessageBoxW(NULL, L"错误", L"asm", MB_OK);*/
// showerrormassage();
// return 0;
//}
程序》实例化》进程》多个窗口
//1.注册窗口
TCHAR szWndclassName[] = { _T("chongmousyy") };
WNDCLASSEX wc = { 0 };
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_VREDRAW|CS_HREDRAW;//窗口类型
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL,IDC_HAND);//图标
wc.hCursor = LoadCursor(NULL,IDC_ARROW );//光标FDXX
wc.hbrBackground = CreateSolidBrush(RGB(0,0,255));//窗口背景颜色刷子
wc.lpszClassName = szWndclassName;//窗口类名,窗口名字不可以为空
wc.lpszMenuName = NULL;//窗口菜单
if (RegisterClassEx(&wc) == 0)
{
showerrormassage();
return 0;
};
//2.创建窗口
TCHAR szWndName[] = { _T("翀某人") };
HWND hwnd = CreateWindowEx(0,
szWndclassName,
szWndName,
WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_VISIBLE|WS_OVERLAPPED|WS_SYSMENU,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
);
if (hwnd == 0)
{
showerrormassage();
return 0;
}
//3.显示跟新窗口
ShowWindow(hwnd, SW_SHOWNORMAL);
//4.消息循环(消息队列)
BOOL bRET;
MSG msg;
while ((bRET=GetMessage(&msg, NULL, 0, 0))!=0) {
if (bRET==-1) {
break;
}
else
{
DispatchMessage(&msg);//派发消息
}
}
//5.消息处理
//资源
return 0;
}