(HBRUSH)(COLOR_WINDOW+1)等同GetSysColorBrush(COLOR_WINDOW)

在Windows编程中,使用颜色宏时需要将其值加1,以避免与NULL值混淆。这是因为颜色宏如COLOR_SCROLLBAR被定义为0,若不加1则会导致意外地设置为NULL。此操作并无特殊意义,仅为防止NULL赋值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      Windows requires that you add 1 when you use these identifiers and are specifying them in the hbrBackground field of the WNDCLASS structure, but doing so has no profound purpose other than to prevent the value from being NULL.

--摘自《window程序设计》
意思是说,使用颜色的时候,必须把每个颜色宏+1,才能得到正确的颜色,这是用法,没有特别的含义。
因为滚动条颜色宏被定义成 #define COLOR_SCROLLBAR 0
如果不进行+1的话,使用这个颜色就是意外的变成NULL,为了避免这种情况,所以把所有的颜色值+1处理。

 

其他里面具体怎么实现的,我还真不知道,微软说的:要+1。

#define UNICODE #define _UNICODE #include <windows.h> #include <math.h> #include <wchar.h> #include “aip_common.h” // Constants for window dimensions, gravity, and animation #define U4_SIM_WINDOW_WIDTH 600U #define U4_SIM_WINDOW_HEIGHT 500U #define U1_SIM_BALL_RADIUS 10U #define S8_SIM_GRAVITY 0.0008 #define S8_SIM_REBOUND_FACTOR 0.5 #define U4_SIM_GROUND_Y (U4_SIM_WINDOW_HEIGHT - 150U) // UI control IDs and Timer ID #define U2_CTRL_HEIGHT_INPUT 201U #define U2_CTRL_REBOUNDS_INPUT 202U #define U2_CTRL_SUBMIT_BUTTON 203U #define U4_SIM_TIMER_ID 101U // Ball structure typedef struct { S8 S8_X_POSITION; S8 S8_Y_POSITION; S8 S8_VERTICAL_VELOCITY; S8 S8_CURRENT_HEIGHT; U2 U2_REBOUNDS_COUNT; U2 U2_MAX_REBOUNDS; U1 U1_SIM_ACTIVE; U1 U1_IS_FALLING; S8 S8_INITIAL_WAIT_TIME_MS; S8 S8_TOTAL_DISTANCE; } ST_SIM_BALL; // Global variables ST_SIM_BALL ST_SIM_BALL_INSTANCE = {0}; HWND HWND_CTRL_HEIGHT_INPUT; HWND HWND_CTRL_REBOUNDS_INPUT; HWND HWND_CTRL_SUBMIT_BUTTON; HWND HWND_SIM_MAIN_WINDOW = NULL; HWND HWND_RESULT_WINDOW = NULL; U4 U4_LAST_SIM_TICK_TIME = 0; S8 S8_SIM_REBOUND_HEIGHTS[100] = {0}; S8 S8_SIM_CUMULATIVE_DISTANCES[100] = {0}; // Function prototypes void FP_SIM_INITIALIZE_BALL(S8 S8_INITIAL_HEIGHT_METERS, U2 U2_MAX_REBOUNDS); void FP_SIM_UPDATE_BALL(U4 U4_DELTA_TIME_MS); void FP_SIM_RENDER_SCENE(HDC hdc); LRESULT CALLBACK FP_RESULTS_WINDOW_PROC(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); void FP_DISPLAY_SIMULATION_RESULTS(HINSTANCE HINSTANCE_CURRENT); LRESULT CALLBACK FP_MAIN_WINDOW_PROC(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); /* ------------------------------------------------------------------ Initialize ball properties ------------------------------------------------------------------ */ void FP_SIM_INITIALIZE_BALL(S8 S8_INITIAL_HEIGHT_METERS, U2 U2_MAX_REBOUNDS) { if (S8_INITIAL_HEIGHT_METERS <= 0 || U2_MAX_REBOUNDS <= 0) return; S8 S8_INITIAL_HEIGHT_PIXELS = S8_INITIAL_HEIGHT_METERS * 2.0; ST_SIM_BALL_INSTANCE.S8_X_POSITION = U4_SIM_WINDOW_WIDTH / 2.0; ST_SIM_BALL_INSTANCE.S8_Y_POSITION = U4_SIM_GROUND_Y - S8_INITIAL_HEIGHT_PIXELS; ST_SIM_BALL_INSTANCE.S8_VERTICAL_VELOCITY = 0; ST_SIM_BALL_INSTANCE.S8_CURRENT_HEIGHT = S8_INITIAL_HEIGHT_PIXELS; ST_SIM_BALL_INSTANCE.U2_REBOUNDS_COUNT = 0; ST_SIM_BALL_INSTANCE.U2_MAX_REBOUNDS = U2_MAX_REBOUNDS; ST_SIM_BALL_INSTANCE.U1_SIM_ACTIVE = TRUE; ST_SIM_BALL_INSTANCE.U1_IS_FALLING = FALSE; ST_SIM_BALL_INSTANCE.S8_INITIAL_WAIT_TIME_MS = 2000.0; ST_SIM_BALL_INSTANCE.S8_TOTAL_DISTANCE = 0.0; for (U2 U2_I = 0; U2_I < 100; U2_I++) { S8_SIM_REBOUND_HEIGHTS[U2_I] = 0; S8_SIM_CUMULATIVE_DISTANCES[U2_I] = 0; } } /* ------------------------------------------------------------------ Update ball physics ------------------------------------------------------------------ */ void FP_SIM_UPDATE_BALL(U4 U4_DELTA_TIME_MS) { if (!ST_SIM_BALL_INSTANCE.U1_SIM_ACTIVE) return; if (ST_SIM_BALL_INSTANCE.S8_INITIAL_WAIT_TIME_MS > 0) { ST_SIM_BALL_INSTANCE.S8_INITIAL_WAIT_TIME_MS -= U4_DELTA_TIME_MS; if (ST_SIM_BALL_INSTANCE.S8_INITIAL_WAIT_TIME_MS <= 0) { ST_SIM_BALL_INSTANCE.S8_INITIAL_WAIT_TIME_MS = 0; ST_SIM_BALL_INSTANCE.U1_IS_FALLING = TRUE; } return; } if (ST_SIM_BALL_INSTANCE.U1_IS_FALLING) { ST_SIM_BALL_INSTANCE.S8_VERTICAL_VELOCITY += S8_SIM_GRAVITY * U4_DELTA_TIME_MS; ST_SIM_BALL_INSTANCE.S8_Y_POSITION += ST_SIM_BALL_INSTANCE.S8_VERTICAL_VELOCITY * U4_DELTA_TIME_MS; if (ST_SIM_BALL_INSTANCE.S8_Y_POSITION >= U4_SIM_GROUND_Y - U1_SIM_BALL_RADIUS) { ST_SIM_BALL_INSTANCE.S8_Y_POSITION = U4_SIM_GROUND_Y - U1_SIM_BALL_RADIUS; ST_SIM_BALL_INSTANCE.U1_IS_FALLING = FALSE; S8_SIM_CUMULATIVE_DISTANCES[ST_SIM_BALL_INSTANCE.U2_REBOUNDS_COUNT] = ST_SIM_BALL_INSTANCE.S8_TOTAL_DISTANCE + ST_SIM_BALL_INSTANCE.S8_CURRENT_HEIGHT; S8_SIM_REBOUND_HEIGHTS[ST_SIM_BALL_INSTANCE.U2_REBOUNDS_COUNT] = ST_SIM_BALL_INSTANCE.S8_CURRENT_HEIGHT * S8_SIM_REBOUND_FACTOR; ST_SIM_BALL_INSTANCE.S8_TOTAL_DISTANCE += ST_SIM_BALL_INSTANCE.S8_CURRENT_HEIGHT; ST_SIM_BALL_INSTANCE.U2_REBOUNDS_COUNT++; if (ST_SIM_BALL_INSTANCE.U2_REBOUNDS_COUNT < ST_SIM_BALL_INSTANCE.U2_MAX_REBOUNDS) { ST_SIM_BALL_INSTANCE.S8_CURRENT_HEIGHT *= S8_SIM_REBOUND_FACTOR; ST_SIM_BALL_INSTANCE.S8_VERTICAL_VELOCITY = -sqrt(2.0 * S8_SIM_GRAVITY * ST_SIM_BALL_INSTANCE.S8_CURRENT_HEIGHT); } else { ST_SIM_BALL_INSTANCE.U1_SIM_ACTIVE = FALSE; } } } else { ST_SIM_BALL_INSTANCE.S8_Y_POSITION += ST_SIM_BALL_INSTANCE.S8_VERTICAL_VELOCITY * U4_DELTA_TIME_MS; ST_SIM_BALL_INSTANCE.S8_VERTICAL_VELOCITY += S8_SIM_GRAVITY * U4_DELTA_TIME_MS; if (ST_SIM_BALL_INSTANCE.S8_VERTICAL_VELOCITY >= 0) { ST_SIM_BALL_INSTANCE.U1_IS_FALLING = TRUE; } } } /* ------------------------------------------------------------------ Render simulation scene ------------------------------------------------------------------ */ void FP_SIM_RENDER_SCENE(HDC hdc) { // Draw ground HPEN HPEN_GROUND = CreatePen(PS_SOLID, 2, RGB(0, 128, 0)); HPEN HPEN_OLD = (HPEN)SelectObject(hdc, HPEN_GROUND); MoveToEx(hdc, 0, U4_SIM_GROUND_Y, NULL); LineTo(hdc, U4_SIM_WINDOW_WIDTH, U4_SIM_GROUND_Y); SelectObject(hdc, HPEN_OLD); DeleteObject(HPEN_GROUND); // Draw ball HBRUSH HBRUSH_BALL = CreateSolidBrush(RGB(139, 69, 19)); HBRUSH HBRUSH_OLD = (HBRUSH)SelectObject(hdc, HBRUSH_BALL); Ellipse(hdc, (int)(ST_SIM_BALL_INSTANCE.S8_X_POSITION - U1_SIM_BALL_RADIUS), (int)(ST_SIM_BALL_INSTANCE.S8_Y_POSITION - U1_SIM_BALL_RADIUS), (int)(ST_SIM_BALL_INSTANCE.S8_X_POSITION + U1_SIM_BALL_RADIUS), (int)(ST_SIM_BALL_INSTANCE.S8_Y_POSITION + U1_SIM_BALL_RADIUS)); SelectObject(hdc, HBRUSH_OLD); DeleteObject(HBRUSH_BALL); } /* ------------------------------------------------------------------ Result window procedure ------------------------------------------------------------------ */ LRESULT CALLBACK FP_RESULTS_WINDOW_PROC(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); wchar_t WSTRING_BUFFER[256]; U2 U2_OFFSET = 10; HFONT HFONT_RESULT = CreateFontW(18, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, L"Arial"); HFONT HFONT_OLD = (HFONT)SelectObject(hdc, HFONT_RESULT); swprintf(WSTRING_BUFFER, 256, L"Total Travel Distance: %.2f meters", ST_SIM_BALL_INSTANCE.S8_TOTAL_DISTANCE / 2.0); TextOutW(hdc, 10, U2_OFFSET, WSTRING_BUFFER, wcslen(WSTRING_BUFFER)); U2_OFFSET += 20; for (U2 U2_I = 0; U2_I < ST_SIM_BALL_INSTANCE.U2_REBOUNDS_COUNT; U2_I++) { swprintf(WSTRING_BUFFER, 256, L"Rebound %d Height: %.2f meters", U2_I + 1, S8_SIM_REBOUND_HEIGHTS[U2_I] / 2.0); TextOutW(hdc, 10, U2_OFFSET, WSTRING_BUFFER, wcslen(WSTRING_BUFFER)); U2_OFFSET += 20; swprintf(WSTRING_BUFFER, 256, L"Cumulative Distance: %.2f meters", S8_SIM_CUMULATIVE_DISTANCES[U2_I] / 2.0); TextOutW(hdc, 10, U2_OFFSET, WSTRING_BUFFER, wcslen(WSTRING_BUFFER)); U2_OFFSET += 20; } SelectObject(hdc, HFONT_OLD); DeleteObject(HFONT_RESULT); EndPaint(hwnd, &ps); return 0; } case WM_DESTROY: HWND_RESULT_WINDOW = NULL; return 0; default: return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; } /* ------------------------------------------------------------------ Display simulation results ------------------------------------------------------------------ */ void FP_DISPLAY_SIMULATION_RESULTS(HINSTANCE HINSTANCE_CURRENT) { if (HWND_RESULT_WINDOW != NULL) { InvalidateRect(HWND_RESULT_WINDOW, NULL, TRUE); return; } const wchar_t CLASS_NAME[] = L"ResultWindow"; WNDCLASS WNDCLASS_RESULTS = {0}; WNDCLASS_RESULTS.lpfnWndProc = FP_RESULTS_WINDOW_PROC; WNDCLASS_RESULTS.hInstance = HINSTANCE_CURRENT; WNDCLASS_RESULTS.lpszClassName = CLASS_NAME; WNDCLASS_RESULTS.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); RegisterClass(&WNDCLASS_RESULTS); HWND_RESULT_WINDOW = CreateWindow(CLASS_NAME, L"Simulation Results", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, HINSTANCE_CURRENT, NULL); ShowWindow(HWND_RESULT_WINDOW, SW_SHOW); UpdateWindow(HWND_RESULT_WINDOW); } /* ------------------------------------------------------------------ Main window procedure ------------------------------------------------------------------ */ LRESULT CALLBACK FP_MAIN_WINDOW_PROC(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_CREATE: { // Create input controls CreateWindow(L"STATIC", L"Initial Height (meters):", WS_VISIBLE | WS_CHILD, 20, U4_SIM_WINDOW_HEIGHT - 140, 170, 30, hwnd, NULL, NULL, NULL); HWND_CTRL_HEIGHT_INPUT = CreateWindow(L"EDIT", L"100", WS_VISIBLE | WS_CHILD | WS_BORDER | ES_NUMBER, 190, U4_SIM_WINDOW_HEIGHT - 140, 100, 30, hwnd, (HMENU)U2_CTRL_HEIGHT_INPUT, NULL, NULL); CreateWindow(L"STATIC", L"Max Rebounds:", WS_VISIBLE | WS_CHILD, 20, U4_SIM_WINDOW_HEIGHT - 100, 170, 30, hwnd, NULL, NULL, NULL); HWND_CTRL_REBOUNDS_INPUT = CreateWindow(L"EDIT", L"10", WS_VISIBLE | WS_CHILD | WS_BORDER | ES_NUMBER, 190, U4_SIM_WINDOW_HEIGHT - 100, 100, 30, hwnd, (HMENU)U2_CTRL_REBOUNDS_INPUT, NULL, NULL); HWND_CTRL_SUBMIT_BUTTON = CreateWindow(L"BUTTON", L"Submit", WS_VISIBLE | WS_CHILD, 310, U4_SIM_WINDOW_HEIGHT - 120, 100, 40, hwnd, (HMENU)U2_CTRL_SUBMIT_BUTTON, NULL, NULL); // Initialize default ball position ST_SIM_BALL_INSTANCE.S8_X_POSITION = U4_SIM_WINDOW_WIDTH / 2.0; ST_SIM_BALL_INSTANCE.S8_Y_POSITION = U4_SIM_GROUND_Y - 50; SetTimer(hwnd, U4_SIM_TIMER_ID, 10, NULL); return 0; } case WM_COMMAND: { if (LOWORD(wParam) == U2_CTRL_SUBMIT_BUTTON) { wchar_t HEIGHT_BUFFER[32], REBOUNDS_BUFFER[32]; // Get input values GetWindowText(HWND_CTRL_HEIGHT_INPUT, HEIGHT_BUFFER, 32); double HEIGHT_VALUE = _wtof(HEIGHT_BUFFER); GetWindowText(HWND_CTRL_REBOUNDS_INPUT, REBOUNDS_BUFFER, 32); int REBOUNDS_VALUE = _wtoi(REBOUNDS_BUFFER); // Validate inputs if (HEIGHT_VALUE <= 0 || HEIGHT_VALUE > 150) { MessageBox(hwnd, L"Height out of range! (0-150 meters)", L"Invalid Input", MB_ICONERROR); return 0; } if (REBOUNDS_VALUE <= 0 || REBOUNDS_VALUE > 100) { MessageBox(hwnd, L"Rebound count must be between 1-100", L"Invalid Input", MB_ICONERROR); return 0; } // Stop current simulation KillTimer(hwnd, U4_SIM_TIMER_ID); // Initialize new simulation FP_SIM_INITIALIZE_BALL(HEIGHT_VALUE, REBOUNDS_VALUE); // Record start time U4_LAST_SIM_TICK_TIME = GetTickCount(); // Restart timer SetTimer(hwnd, U4_SIM_TIMER_ID, 10, NULL); // Force redraw InvalidateRect(hwnd, NULL, TRUE); } return 0; } case WM_TIMER: { if (wParam == U4_SIM_TIMER_ID) { // Calculate time delta U4 CURRENT_TIME = GetTickCount(); U4 DELTA_TIME = (U4_LAST_SIM_TICK_TIME == 0) ? 0 : (CURRENT_TIME - U4_LAST_SIM_TICK_TIME); U4_LAST_SIM_TICK_TIME = CURRENT_TIME; if (ST_SIM_BALL_INSTANCE.U1_SIM_ACTIVE) { // Update ball physics FP_SIM_UPDATE_BALL(DELTA_TIME); // Redraw only the necessary area RECT UPDATE_RECT = { 0, 0, U4_SIM_WINDOW_WIDTH, U4_SIM_GROUND_Y + U1_SIM_BALL_RADIUS }; InvalidateRect(hwnd, &UPDATE_RECT, TRUE); } else { // Simulation complete - show results KillTimer(hwnd, U4_SIM_TIMER_ID); FP_DISPLAY_SIMULATION_RESULTS( (HINSTANCE)GetWindowLongPtr(hwnd, GWLP_HINSTANCE) ); } } return 0; } case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); // Clear background RECT rect; GetClientRect(hwnd, &rect); FillRect(hdc, &rect, (HBRUSH)(COLOR_WINDOW+1)); // Draw simulation elements FP_SIM_RENDER_SCENE(hdc); // Display initial wait state if (ST_SIM_BALL_INSTANCE.S8_INITIAL_WAIT_TIME_MS > 0) { wchar_t STATUS[100]; swprintf(STATUS, 100, L"Initial state: %.1f seconds remaining", ST_SIM_BALL_INSTANCE.S8_INITIAL_WAIT_TIME_MS / 1000.0); HFONT HFONT_STATUS = CreateFont(18, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, L"Arial"); HFONT HFONT_OLD = (HFONT)SelectObject(hdc, HFONT_STATUS); TextOut(hdc, 20, 20, STATUS, wcslen(STATUS)); SelectObject(hdc, HFONT_OLD); DeleteObject(HFONT_STATUS); } EndPaint(hwnd, &ps); return 0; } case WM_DESTROY: { KillTimer(hwnd, U4_SIM_TIMER_ID); PostQuitMessage(0); return 0; } default: return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; } /* ------------------------------------------------------------------ Application entry point ------------------------------------------------------------------ */ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { const wchar_t CLASS_NAME[] = L"BouncingBallSimulation"; WNDCLASS WNDCLASS_MAIN = {0}; WNDCLASS_MAIN.lpfnWndProc = FP_MAIN_WINDOW_PROC; WNDCLASS_MAIN.hInstance = hInstance; WNDCLASS_MAIN.lpszClassName = CLASS_NAME; WNDCLASS_MAIN.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); if (!RegisterClass(&WNDCLASS_MAIN)) { return 0; } // Calculate window size including non-client area RECT rect = {0, 0, U4_SIM_WINDOW_WIDTH, U4_SIM_WINDOW_HEIGHT}; AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, TRUE); int WIDTH = rect.right - rect.left; int HEIGHT = rect.bottom - rect.top; // Create main window HWND_SIM_MAIN_WINDOW = CreateWindow( CLASS_NAME, L"Bouncing Ball Simulation", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, WIDTH, HEIGHT, NULL, NULL, hInstance, NULL ); if (!HWND_SIM_MAIN_WINDOW) { return 0; } // Main message loop MSG MSG_SIM_LOOP; while (GetMessage(&MSG_SIM_LOOP, NULL, 0, 0)) { TranslateMessage(&MSG_SIM_LOOP); DispatchMessage(&MSG_SIM_LOOP); } return (int)MSG_SIM_LOOP.wParam; } 就在源代码上修改编码规范,刚刚的代码又逻辑不通了’
08-09
case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hwn, &ps); // 设置坐标系参数 U4 u4_t_Draw_originX; U4 u4_t_Draw_originY; U4 u4_t_Draw_axisLength; u4_t_Draw_originX = ORIGIN_X; u4_t_Draw_originY = ORIGIN_Y; u4_t_Draw_axisLength = AXIS_LENGTH; // 创建白色画笔用于坐标轴 HPEN hAxisPen = CreatePen(PS_SOLID, StrokeWidth, COLOR_WHITE); HPEN hOldPen = (HPEN)SelectObject(hdc, hAxisPen); // 绘制X轴 MoveToEx(hdc, u4_t_Draw_originX, u4_t_Draw_originY, NULL); LineTo(hdc, u4_t_Draw_originX + u4_t_Draw_axisLength, u4_t_Draw_originY); // 绘制Y轴 MoveToEx(hdc, u4_t_Draw_originX, u4_t_Draw_originY, NULL); LineTo(hdc, u4_t_Draw_originX, u4_t_Draw_originY - u4_t_Draw_axisLength); // 绘制X轴箭头 MoveToEx(hdc, u4_t_Draw_originX + u4_t_Draw_axisLength, u4_t_Draw_originY, NULL); LineTo(hdc, u4_t_Draw_originX + u4_t_Draw_axisLength - ARROW_SIZE, u4_t_Draw_originY - ARROW_OFFSET); MoveToEx(hdc, u4_t_Draw_originX + u4_t_Draw_axisLength, u4_t_Draw_originY, NULL); LineTo(hdc, u4_t_Draw_originX + u4_t_Draw_axisLength - ARROW_SIZE, u4_t_Draw_originY + ARROW_OFFSET); // 绘制Y轴箭头 MoveToEx(hdc, u4_t_Draw_originX, u4_t_Draw_originY - u4_t_Draw_axisLength, NULL); LineTo(hdc, u4_t_Draw_originX - ARROW_OFFSET, u4_t_Draw_originY - u4_t_Draw_axisLength + ARROW_SIZE); MoveToEx(hdc, u4_t_Draw_originX, u4_t_Draw_originY - u4_t_Draw_axisLength, NULL); LineTo(hdc, u4_t_Draw_originX + ARROW_OFFSET, u4_t_Draw_originY - u4_t_Draw_axisLength + ARROW_SIZE); // 标注坐标轴 SetTextColor(hdc, COLOR_WHITE); SetBkColor(hdc, COLOR_BLACK); TextOut(hdc, u4_t_Draw_originX + u4_t_Draw_axisLength - AXIS_LABEL_OFFSET, u4_t_Draw_originY + AXIS_LABEL_OFFSET, L"X", ONE); TextOut(hdc, u4_t_Draw_originX - AXIS_LABEL_OFFSET, u4_t_Draw_originY - u4_t_Draw_axisLength + AXIS_LABEL_Y_OFFSET, L"Y", ONE); TextOut(hdc, u4_t_Draw_originX - ORIGIN_LABEL_OFFSET, u4_t_Draw_originY + ORIGIN_LABEL_OFFSET / 2, L"O", ONE); // 如果设置了点,绘制点和连线 if (pointsSet) { // 计算实际绘制位置 U4 u4_t_Draw_Ax = u4_t_Draw_originX + u2_g_position_ax; U4 u4_t_Draw_Ay = u4_t_Draw_originY - u2_g_position_ay; U4 u4_t_Draw_Bx = u4_t_Draw_originX + u2_g_position_ay; U4 u4_t_Draw_By = u4_t_Draw_originY - u2_g_position_by; // 绘制点 Drawpixel(hdc, u4_t_Draw_originX, u4_t_Draw_originY, u2_g_position_ax, u2_g_position_ay); Drawpixel(hdc, u4_t_Draw_originX, u4_t_Draw_originY, u2_g_position_ay, u2_g_position_by); // 创建红色画笔用于连接线 HPEN hRedPen = CreatePen(PS_SOLID, StrokeWidth, COLOR_RED); SelectObject(hdc, hRedPen); // 绘制直线 MoveToEx(hdc, u4_t_Draw_Ax, u4_t_Draw_Ay, NULL); LineTo(hdc, u4_t_Draw_Bx, u4_t_Draw_By); // 标记点 SetTextColor(hdc, COLOR_LIGHT_RED); SetBkMode(hdc, TRANSPARENT); TextOut(hdc, u4_t_Draw_Ax + POINT_LABEL_OFFSET, u4_t_Draw_Ay - POINT_LABEL_OFFSET, L"A", ONE); SetTextColor(hdc, COLOR_LIGHT_BLUE); TextOut(hdc, u4_t_Draw_Bx + POINT_LABEL_OFFSET, u4_t_Draw_By - POINT_LABEL_OFFSET, L"B", ONE); // 清理资源 SelectObject(hdc, hRedPen); DeleteObject(hRedPen); } else { } // 恢复原始画笔并清理资源 SelectObject(hdc, hOldPen); DeleteObject(hAxisPen); EndPaint(hwn, &ps); return ZERO; } case WM_DESTROY: PostQuitMessage(ZERO); return ZERO; } return DefWindowProc(hwn, msg, wParam, lParam); } 该函数中,hdc的作用是什么
07-25
根据以下C语言函数,新增一个画填充圆函数 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////画点////////////////////////////////////////////////////////////////// AT(.text.lcd) void lcd_draw_point_orthogon(u16 x_start,u16 y_start) { lcd_open_window(x_start,y_start,x_start,y_start); lcd_fill_color(1,1,lcd.font_color); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////画矩形////////////////////////////////////////////////////////////////// AT(.text.lcd) void lcd_draw_imagew_orthogon(u16 x_start,u16 y_start,u16 x_len,u16 y_len) { if((x_len==0)||(y_len==0))return; #if ST7789V_LCD_EN lcd_open_window(x_start,lcd.height-1-(y_start+y_len-1),x_len+x_start-1,lcd.height-1-y_start); #else lcd_open_window(x_start,y_start,x_start+x_len-1,y_start+y_len-1); #endif lcd_fill_color(x_len,y_len,lcd.font_color); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////画矩形////////////////////////////////////////////////////////////////// AT(.text.lcd) void lcd_draw_imagew_orthogon_reverse(u16 x_start,u16 y_start,u16 x_len,u16 y_len ) { u16 font_color_temp; u16 back_color_temp; if((x_len==0)||(y_len==0))return; font_color_temp=lcd.font_color; back_color_temp=lcd.back_color; lcd_font_color_set(back_color_temp); lcd_background_color_set(font_color_temp); #if ST7789V_LCD_EN lcd_open_window(x_start,lcd.height-1-(y_start+y_len-1),x_len+x_start-1,lcd.height-1-y_start); #else lcd_open_window(x_start,y_start,x_start+x_len-1,y_start+y_len-1); #endif lcd_fill_color(x_len,y_len,lcd.font_color); lcd_font_color_set(font_color_temp); lcd_background_color_set(back_color_temp); }
03-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值