1. 程式人生 > >C語言學習 18-11-12

C語言學習 18-11-12

1.畫兩個矩形並使其移動

需要在定時器處理訊息中進行繪製圖像。

case WM_TIMER:
	hdc = GetDC(h_wnd);
	a += 5;									// 需要設定a為靜態變數
	b += 10;								// 需要設定b為靜態變數
	Ellipse(hdc, a, 50, a+50, 100);
	Ellipse(hdc, b+50, 200, b+100, 250);
	ReleaseDC(h_wnd, hdc);*/
	break;

2.設定兩個矩形的移動速率不同

設定兩個定時器,通過定時器的ID來區分定時器。

case WM_TIMER:
	hdc = GetDC
(h_wnd); brush = CreateSolidBrush(RGB(255, 255, 255)); SelectObject(hdc, brush); if(1 == w_param) { a += 5; Ellipse(hdc, a, 50, a+50, 100); } if(2 == w_param) { b += 10; Ellipse(hdc, b+50, 200, b+100, 250); } ReleaseDC(h_wnd, hdc); break;

3.設定按A鍵使得其中一個矩形停止

1.在 KETDOWN 中設定,矩形停止運動也即定時器停止;

2.定時器停止使用函式 KillTimer(h_wnd, timer id)

case WM_KEYDOWN:
	if(65 == w_param)				// A鍵使得第二個停止
	{
		KillTimer(h_wnd, 2);
	}
	if(66 == w_param)				// B鍵使得第二個停止
	{
		KillTimer(h_wnd, 1);
	}

	break;

4.貪吃蛇專案

1.在 右側->資原始檔->新增->資源->bitmap->匯入 已有的影象檔案,需要注意的是,我們新增的bitmap檔案所在的位置應該在當前c檔案所在的資料夾下。

2.當我們完成第一步後會在資原始檔中產生點陣圖檔案和一個**.rc檔案,在標頭檔案中會生成一個resource.h**標頭檔案,其中所儲存的資訊是點陣圖的名字。

3.匯入點陣圖檔案到Win32專案中,需要使用函式 LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP)),該函式返回一個 Bitmap 的控制代碼,因此需要一個控制代碼來接受該函式的返回值,控制代碼的型別是 HBITMAP。

4.將背景圖片顯示到視窗中,需要獲得h_dc控制代碼,在WM_PAINT訊息中,除了獲得h_dc控制代碼,還需要獲得一個相容控制代碼來儲存影象。

5.使用相容控制代碼來選擇影象,SelectObject(image_dc, image_backageground)。

6.將選中的影象傳輸到hdc中,使用函式 BitBlt(目標控制代碼 hdc,起始 x值,起始 y值,要傳輸的寬度,要傳輸的高度,城防影象的控制代碼 image_dc,盛放的圖片的起始 x值,盛放的圖片的起始 y值,SRCCOPY)。

7.刪除生成的image_dc

8.程式:

#include "Windows.h"
#include "stdlib.h"
#include "stdio.h"
#include "resource.h"				// 新增影象資源之後的生成的包含影象名稱的標頭檔案,自動生成

LRESULT CALLBACK my_wndproc(HWND h_wnd, UINT message_flag, WPARAM w_param, LPARAM l_param);
static int a = 50;
static int b = 100;

// 定義影象控制代碼
HBITMAP image_background;
HBITMAP image_snack_head_up;
HBITMAP image_snack_head_down;
HBITMAP image_snack_head_left;
HBITMAP image_snack_head_right;
HBITMAP image_snack_body;
HBITMAP image_apple;



int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
					 LPSTR IpCmdLine, int nCmdShow)
{
	HWND h_wnd;
	MSG my_msg;
	// 1.設計視窗
	WNDCLASSEX ex;
	ex.style = CS_HREDRAW/* | CS_VREDRAW*/;			// 視窗的重新整理方式,當水平重新整理時,改變視窗的高度會重繪;當垂直重新整理時,改變視窗的寬度會重繪;
	ex.cbSize = sizeof(WNDCLASSEX);				// 當前結構體的大小
	ex.cbClsExtra = 0;							// 為結構體開闢附加空間儲存結構體的附加資訊
	ex.cbWndExtra = 0;							// 註冊視窗時申請的空間大小存放此視窗的特有資料,通常為0
	ex.hInstance = hInstance;					// 應用程式控制代碼,此結構體在哪個應用程式中使用
	ex.hIcon = NULL;							// 指定視窗類圖示的控制代碼
	ex.hCursor = NULL;							// 載入滑鼠為空使用系統預設圖示
	ex.hbrBackground = CreateSolidBrush(RGB(0, 0, 255));	// 指定背景畫刷控制代碼
	ex.hIconSm = NULL;							// 窗體圖示,最左上角的小圖示
	ex.lpfnWndProc = &my_wndproc;						// 訊息處理函式指標
	ex.lpszMenuName = NULL;						// 載入選單名,為空則沒有選單
	ex.lpszClassName = "aa";					// 字符集,預設為unicode,可在專案中修改為多字元

	// 2.註冊視窗
	RegisterClassEx(&ex);

	// 3.建立視窗
	h_wnd = CreateWindow(ex.lpszClassName, "hahaah", WS_OVERLAPPEDWINDOW, 50, 50, 616, 638, NULL, NULL, hInstance, NULL);

	// 4.顯示視窗
	ShowWindow(h_wnd, SW_SHOW);

	// 讀入影象
	image_background = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP1));
	image_apple = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP2));
	image_snack_body = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP3));
	image_snack_head_up = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP7));
	image_snack_head_down = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP5));
	image_snack_head_left = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP4));
	image_snack_head_right = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP6));


	// 設定重新整理時間
	SetTimer(h_wnd, 1, 500, NULL);
	SetTimer(h_wnd, 2, 200, NULL);

	// GetMessage(指向一個MSG指標,指向接受哪個視窗的訊息 為NULL接收所有視窗,指定要獲取的訊息的最小值 通常為0,指定要獲取的訊息的最小值 最大最小都為0則接收所有)
	while(GetMessage(&my_msg, NULL, 0, 0))
	{
		TranslateMessage(&my_msg);				// 翻譯訊息
		DispatchMessage(&my_msg);				// 分發訊息
	}

	return 0;
}

LRESULT CALLBACK my_wndproc(HWND h_wnd, UINT message_flag, WPARAM w_param, LPARAM l_param)
{
	HDC hdc;
	HDC image_dc;

	switch (message_flag)
	{
	case WM_CLOSE:
		PostQuitMessage(0);
		break;

	case WM_KEYDOWN:
		break;

	case WM_PAINT:
		hdc = BeginPaint(h_wnd, &ps);
		image_dc = CreateCompatibleDC(hdc);
		SelectObject(image_dc, image_background);
		BitBlt(hdc, 0, 0, 600, 600, image_dc, 0, 0, SRCCOPY);
		DeleteDC(image_dc);
		ReleaseDC(h_wnd, hdc);
		break;

	case WM_LBUTTONUP:
		break;

	case WM_TIMER:
		break;

	default:
		break;
	}

	return DefWindowProc(h_wnd, message_flag, w_param, l_param);
}