📄 hello.cpp
字号:
#include <windows.h> //包含有数据类型的定义、API入口点定义和其它有用的参数信息。
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
//把这个程序支解为四块:
//(一)注册窗口类..
//要WinMain登记窗口类,首先要填写一个WNDCLASS结构
static TCHAR szAppName[] = TEXT ("HelloWin") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wc ;
wc.style = CS_HREDRAW | CS_VREDRAW;//CS_NOCLOSE;
wc.lpfnWndProc = WndProc ;
wc.cbClsExtra = 0 ;
wc.cbWndExtra = 0 ;
wc.hInstance = hInstance ;
wc.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wc.hCursor = LoadCursor (NULL, IDC_ARROW) ;//IDC_WAIT
wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wc.lpszMenuName = NULL ;
wc.lpszClassName = szAppName ;
if (!RegisterClass (&wc))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ;
return 0 ;
}
//(二)创建窗口
hwnd = CreateWindow (szAppName, // window class name
TEXT ("欢迎你的到来!"), // window caption
WS_OVERLAPPEDWINDOW, // window style
20, // initial x position
30, // initial y position
1000, // initial x size
600, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters
//(三)显示和更新窗口.
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
//调用函数UpdateWindow将产生一个WM_PAINT消息,
//这个消息将使窗口重画,即使窗口得到更新.这个消息
//需要注意的是,由UpdateWindows发送的WM_PAINT消息,
//将直接发送到窗口过程(在上面的例子中是WndProc函数),
//而不是发送到进程的消息队列,因此,尽管这时应用程序的主消息循环尚未启动,
//但是窗口过程仍可接收到该WM_PAINT消息并更新其用户区。
//(四)处理消息.
//从消息队列中取出一个消息,当GetMessage函数检索到WM_QUIT消息,它就返回NULL,并退出消息外循环。
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;//翻译消息
DispatchMessage (&msg) ;//激活窗口过程,来响应该消息
}
return msg.wParam ;//表示从PostQuitMessage返回的值
}
//窗口(处理)过程
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc = NULL ;
HDC hdcMem = NULL;
PAINTSTRUCT ps ;
RECT rect ;
static HBITMAP hbmpPicture= NULL;
static HBITMAP hbmpblush= NULL;
HINSTANCE hInst = NULL;
WORD nxPos,nyPos;
//处理消息......
switch (message)
{
case WM_CREATE:
hInst = ( (LPCREATESTRUCT) lParam )->hInstance;
hbmpPicture = ::LoadBitmap( hInst, TEXT( "picture" ) );
// hbmpblush = ::LoadBitmap( hInst, TEXT( "blush" ) );
return 0L;
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
GetClientRect (hwnd, &rect) ;
// TextOut(hdc, rect.left,rect.top, "Hello, World!", 13);
DrawText (hdc, TEXT ("Hello,World!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
EndPaint (hwnd, &ps) ;
return 0L ;
/*
case WM_LBUTTONDOWN:
hdc = GetDC(hwnd) ;
GetClientRect (hwnd, &rect) ;
TextOut(hdc, LOWORD(lParam),HIWORD(lParam), "Hello, World!", 13);
ReleaseDC(hwnd,hdc) ;
return 0L ;
case WM_MOUSEMOVE:
if (wParam==MK_LBUTTON) {
hdc = GetDC(hwnd) ;
InvalidateRect(hwnd, NULL, TRUE);
UpdateWindow(hwnd);
TextOut(hdc, LOWORD(lParam),HIWORD(lParam), "Hello, World!", 13);
ReleaseDC(hwnd,hdc) ;
}
return 0L;
case WM_LBUTTONUP:
InvalidateRect(hwnd, NULL, TRUE);
UpdateWindow(hwnd);
return 0L;
*/
case WM_LBUTTONDOWN:
hdc = ::GetDC(hwnd) ;//创建屏幕客户区相对应的设备描述表
hdcMem = ::CreateCompatibleDC( hdc );//创建内存设备描述表
::SelectObject( hdcMem, hbmpPicture );//把位图hbmpPicture选入内存设备描述表
::BitBlt(
hdc,
LOWORD(lParam), HIWORD(lParam),
148, 189,
hdcMem,
0, 0,
SRCCOPY );//把内存设备表中的图像传送到屏幕显示
::DeleteDC( hdcMem );
::ReleaseDC(hwnd,hdc) ;
nxPos = LOWORD(lParam),nyPos = HIWORD(lParam);
return 0L;
case WM_MOUSEMOVE:
if (wParam==MK_LBUTTON) {
hdc = ::GetDC(hwnd) ;
if (nxPos!=LOWORD(lParam) && nyPos!=HIWORD(lParam))
{
hdcMem = ::CreateCompatibleDC( hdc );//创建内存设备描述表
::SelectObject( hdcMem, hbmpblush );//把位图hbmpPicture选入内存设备描述表
::BitBlt(
hdc,
nxPos, nyPos,
148, 189,
hdcMem,
0, 0,
WHITENESS );//把内存设备表中的图像传送到屏幕显示
::DeleteDC( hdcMem );
}
hdcMem = ::CreateCompatibleDC( hdc );//创建内存设备描述表
::SelectObject( hdcMem, hbmpPicture );//把位图hbmpPicture选入内存设备描述表
::BitBlt(
hdc,
LOWORD(lParam), HIWORD(lParam),
148, 189,
hdcMem,
0, 0,
SRCCOPY );//把内存设备表中的图像传送到屏幕显示
::DeleteDC( hdcMem );
ReleaseDC(hwnd,hdc) ;
nxPos = LOWORD(lParam),nyPos = HIWORD(lParam);
return 0L;
}
case WM_LBUTTONUP:
InvalidateRect(hwnd, NULL, TRUE);
UpdateWindow(hwnd);
return 0L;
case WM_DESTROY:
//中止应用程序
PostQuitMessage (0) ;//把消息WM_QUIT发送到应用程序队列。
return 0L ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
/*可以发送窗口函数的消息约有220种,所有窗口消息都以WM_开头,这些消息在头文件中被定义为常量。
引起Windows调用窗口函数的原因有很多,,如改变窗口大小啊,改变窗口在屏幕上的位置啊什么的。
*/
/*WNDCLASS结构,其定义如下所示:
typedef struct _WNDCLASSA
{
UINT style ; //窗口类风格
WNDPROC lpfnWndProc ; //指向窗口过程函数的指针
int cbClsExtra ; //窗口附加数据
int cbWndExtra ; //窗口附加数据
HINSTANCE hInstance ; //拥有窗口类的实例句柄
HICON hIcon ; //最小窗口图标
HCURSOR hCursor ; //窗口内使用的光标
HBRUSH hbrBackground ; //用来着色窗口背景的刷子
LPCSTR lpszMenuName ; //指向菜单资源名的指针
LPCSTR lpszClassName ; // 指向窗口类名的指针
} WNDCLASS, *PWNDCLASS;
在VC6.0里面,把光标定位在WNDCLASS上,按F1,即可启动MSDN,在MSDN里你可看到这个结构原形.
*/
/*
MSG结构在头文件中定义如下:
typedef struct tagMSG
{
HWND hwnd; //参数1:hwnd是消息要发送到的那个窗口的句柄,这个窗口就是咱们用CreateWindows函数创建的那一个。如果是在一个有多个窗口的应用程序中,用这个参数就可决定让哪个窗口接收消息。
UINT message; //参数2:message是一个数字,它唯一标识了一种消息类型。每种消息类型都在Windows文件中定义了,这些常量都以WM_开始后面带一些描述了消息特性的名称。比如说当应用程序退出时,Windows就向应用程序发送一条WM_QUIT消息。
WPARAM wParam; //参数3:一个32位的消息参数,这个值的确切意义取决于消息本身。
LPARAM lParam; //同上
DWORD time; //消息放入消息队列中的时间,在这个域中写入的并不是日期,而是从Windows启动后所测量的时间值。Windows用这个域来使用消息保持正确的顺序。
POINT pt; //消息放入消息队列时的鼠标坐标.
} MSG, *PMSG;
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -