复习上一次内容:
把前一次笔记中的代码,简写一下
#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可能会变成Unicodeint 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可能会变成Unicodeint 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 );//光标FDXXwc.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;
}