/*
=========================================================================
主要功能:c++ win窗口消息演示
(c++、win32 api) 张国鹏, 2021
编辑工具:notepad++v7.8.2
编译工具:tdm-gcc-5.1.0-3(32位)
编译指令:
Notepad++快速运行代码:按F5,输入以下指令,即可编译并运行C++ WIN32程序:
方式一:cmd /k cd /d "$(CURRENT_DIRECTORY)" & g++ -std=gnu++11 "$(FILE_NAME)" -o "$(NAME_PART)" & "$(NAME_PART).exe
方式二:cmd /k cd /d "$(CURRENT_DIRECTORY)" & g++ -std=gnu++11 "$(FILE_NAME)" -o "$(NAME_PART)" -static-libgcc -lcomctl32 -lgdi32 -lcomdlg32 -lgdiplus -lwininet -lwinmm -lwinspool & "$(NAME_PART).exe
如果程序含有windows.h以外的库,则用方式二编译即可。
如果不需要CMD窗口出现,编译指令加上这句:-mwindows
编译指令加上这句:-std=gnu++11,即采用c++11编译
注意事项:本书所载代码均为ANSI格式,切勿转为UTF-8格式,否则可能造成不可预料的结果!
=========================================================================
*/
#include <windows.h>
#include <stdio.h>//printf
#include <string>
using namespace std;//注意一定要写这句
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
bool can_close=false;//程序退出前能否退出标志
static int cxClient,cyClient;
HDC hdc;
PAINTSTRUCT ps ;
switch (message)
{
case WM_CREATE:// 0x0001 应用程序创建一个窗口
{
printf("句柄:%d,窗口正在创建中.....!\n",hwnd);
break;
}
case WM_PAINT:// 0x000F 要求一个窗口重绘自己
{
EndPaint (hwnd, &ps) ;
hdc=BeginPaint(hwnd,&ps); //获取要重画的窗口的设备描述表句柄
//在这里画上你想画的内容
string temp;//引用#include <string>
temp="哈哈,这是想要显示的内容!";
TextOut(hdc,10,10,temp.c_str(),temp.size());
EndPaint(hwnd,&ps); //结束重画
return 0;
}
case WM_CONTEXTMENU://右键菜单//cd
{
//Win32创建弹出菜单
POINT point;
::GetCursorPos(&point);//得到鼠标的当前位置
HMENU hMenuPopup = CreatePopupMenu () ;
HMENU hMenuPopup1 = CreatePopupMenu () ;
AppendMenu(hMenuPopup1, MF_STRING, 101, "MF_STRING");
AppendMenu(hMenuPopup1, MF_SEPARATOR, 0, NULL) ;
AppendMenu(hMenuPopup1, MF_CHECKED, 102, "MF_CHECKED");
AppendMenu(hMenuPopup, MF_STRING, 1, "MF_STRING");
AppendMenu(hMenuPopup, MF_SEPARATOR, 0, NULL) ;
AppendMenu(hMenuPopup, MF_CHECKED, 2, "MF_CHECKED");
AppendMenu(hMenuPopup, MF_DISABLED, 3, "MF_DISABLED");
AppendMenu(hMenuPopup, MF_ENABLED, 4, "MF_ENABLED");
AppendMenu(hMenuPopup, MF_GRAYED, 5, "MF_GRAYED");
AppendMenu(hMenuPopup, MF_MENUBARBREAK, 6, "MF_MENUBARBREAK");
AppendMenu(hMenuPopup, MF_STRING, 7, "MF_STRING");
AppendMenu(hMenuPopup, MF_STRING, 8, "MF_STRING");
AppendMenu(hMenuPopup, MF_MENUBREAK, 9, "MF_MENUBREAK");
AppendMenu(hMenuPopup, MF_POPUP,(LONG)hMenuPopup1, "MF_POPUP");
TrackPopupMenu (hMenuPopup, TPM_RIGHTBUTTON, point.x, point.y, 0, hwnd, NULL) ;
DestroyMenu (hMenuPopup1);
DestroyMenu (hMenuPopup);
return 0;
}
case WM_SYSCOMMAND:// 0x0112 选择窗口菜单项或选择最大化或最小化时,发送此消息给该窗口
{
switch(wParam)
{
case SC_MINIMIZE:// 最小化窗口
{
printf("句柄:%d,窗口已被最小化!\n",hwnd);
break;//交由系统处理该条消息
//return 0;//如果不想被最小化,则直接return 0; 告诉系统该条消息已被处理
}
case SC_MAXIMIZE://最大化窗口
{
printf("句柄:%d,窗口已被最大化!\n",hwnd);
break;//交由系统处理该条消息
//return 0;//如果不想被最小化,则直接return 0; 告诉系统该条消息已被处理
}
}
break;
}
case WM_SIZE://窗口尺寸发生改变
{
c