C語言學習 18-11-12
阿新 • • 發佈:2018-12-06
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);
}