⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hello.cpp

📁 WindowsProgrammingFoundation C++学习很好的书籍 希望能够起到帮助
💻 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 + -