WM_NOTIFY消息流程实例分析

本文详细解读了CListCtrl控件在响应HDN_BEGINTRACK消息时的内部处理流程,以及如何在对话框窗口中接收并处理此类消息。通过引入自定义控件CMyListCtrl,实现对特定消息的拦截与处理,展示了MFC消息处理机制的灵活性。

    我们以CListCtrl控件为例来分析WM_NOTIFY消息。

    CListCtrl控件在Report样式下会包含CHeaderCtrl标头控件,即CHeaderCtrl标头控件为CListCtrl控件的子控件,所以不难理解,拖动CHeaderCtrl标头控件的列分隔栏会投递HDN_BEGINTRACK消息(WM_NOTIFY消息,通知码为HDN_BEGINTRACK)给其父窗口CListCtrl控件。

    但是,我们在对话框窗口中也可以收到CHeaderCtrl标头控件的HDN_BEGINTRACK消息,这作何解释呢?

    如下所示:我们在对话框窗口中响应HDN_BEGINTRACK消息,当开始拖动标头控件时,弹出消息框提示。

BEGIN_MESSAGE_MAP(CTestDlgDlg, CDialog)
        ......
	ON_NOTIFY(HDN_BEGINTRACK, 0, &CTestDlgDlg::OnHdnBegintrackList1)
        ......
END_MESSAGE_MAP()

void CTestDlgDlg::OnHdnBegintrackList1(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMHEADER phdr = reinterpret_cast<lpnmheader>(pNMHDR);
	// TODO: Add your control notification handler code here
	AfxMessageBox(TEXT("CHeaderCtrl HDN_BEGINTRACK消息!"));

	*pResult = 0;
}
</lpnmheader>
效果如下:

    在文章MFC消息处理流程概述中可知,CListCtrl控件窗口在接收到HDN_BEGINTRACK消息时,会调用以下代码处理:

LRESULT CWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)  
{  
    // OnWndMsg does most of the work, except for DefWindowProc call  
    LRESULT lResult = 0;  
    if (!OnWndMsg(message, wParam, lParam, &lResult))  
        lResult = DefWindowProc(message, wParam, lParam);  
    return lResult;  
} 

    很显然,HDN_BEGINTRACK消息在CListCtrl的消息映射表中没有对应的消息处理函数处理,在CHeaderCtrl的消息映射表也无对应的反射消息处理函数处理,所以,以上代码OnWndMsg(message, wParam, lParam, &lResult)会返回FALSE,所以会交由默认的消息处理函数DefWindowProc(message, wParam, lParam)处理,该函数会将该消息投递给消息对应窗口(message.hwnd)的父窗口处理,即对话框窗口(当然,对应的message.hwnd变为了对话框窗口),这样对话框窗口才有机会处理该消息而弹出消息框。

    如果在CListCtrl中处理了HDN_BEGINTRACK消息,则就不会交由对话框窗口处理。

    为此,我们增加CMyListCtrl,继承自CListCtrl,在CMyListCtrl中处理HDN_BEGINTRACK消息。

BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
	ON_NOTIFY(HDN_BEGINTRACKA, 0, &CMyListCtrl::OnHdnBegintrack)
	ON_NOTIFY(HDN_BEGINTRACKW, 0, &CMyListCtrl::OnHdnBegintrack)
END_MESSAGE_MAP()

void CMyListCtrl::OnHdnBegintrack(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMHEADER phdr = reinterpret_cast<lpnmheader>(pNMHDR);
	// TODO: Add your control notification handler code here
	AfxMessageBox(TEXT("CMyListCtrl处理了HDN_BEGINTRACK消息"));

	*pResult = 0;
}
</lpnmheader>

    同时将对话框中的CListCtrl m_list改为CMyListCtrl m_list。则效果如下:


实例代码: http://download.csdn.net/detail/wangyao1052/4633804
#include <windows.h> #include "GUI.H" #include "DIALOG.h" #include "LISTVIEW.h" #include "GUI_SIM_Win32.h" #include "LCD_SIM.H" #include "gdi.h" HWND ghWndMain = NULL; int is_main = 0; int select_num = 0; #define ID_BUTTON_0 (GUI_ID_USER + 0x00) #define ID_LISTVIEW_0 (GUI_ID_USER + 0x01) #define ID_WINDOW_0 (GUI_ID_USER + 0x02) static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = { {WINDOW_CreateIndirect, "MainPanel", ID_WINDOW_0, 0, 0, 800, 480, 0, 0x0, 0 }, {BUTTON_CreateIndirect, "Button", ID_BUTTON_0, 40, 420, 60, 15, 0, 0x0, 0 }, {LISTVIEW_CreateIndirect, "Listview", ID_LISTVIEW_0, 0, 50, 400, 300,0, 0x0, 0 }, }; static const char* main_text[][2] = { { "1.", "END" }, { "2.", "SYSTEM BACKUP AND DATA EXPORT" }, { "3.", "SYSTEM RESTORE AND DATA IMPORT" }, { "4.", "SYSTEM UPDATE" }, { "5.", "NVEME DATA UTILITY" }, { "6.", "FRAM DATA UTILITY" }, { "7.", "MEMORY FORMAT" }, { "8.", "FROM DATA UTILITY" }, { "9.", "BOOT SCREEN" }, { "10.", "AUTH" } }; static const char* system_backup_text[][2] = { { "1.", "END" }, { "2.", "BACKUP CNC (*.BAK)" }, { "3.", "EXPORT CNC PROGRAM (PRG.BIN)" }, { "4.", "EXPORT PLC LADDER (LADDER.ZIP)" }, }; static const char* system_restore_text[][2] = { { "1.", "END" }, { "2.", "RESTORE CNC (*.BAK)" }, { "3.", "IMPORT CNC PROGRAM (PRG.BIN)" }, { "4.", "IMPORT PLC LADDER (LADDER.ZIP)" }, }; static const char* system_update_text[][2] = { { "1.", "END" }, }; static const char* nvmem_data_text[][2] = { { "1.", "END" }, { "2.", "BACKUP (CNC -> EXTERNAL MEMORY)" }, { "3.", "RESTORE (EXTERNAL MEMORY -> CNC)" }, { "4.", "RESTORE (AUTO BACKUP -> CNC)" }, { "5.", "FORMAT" }, }; static const char* fram_data_text[][2] = { { "1.", "END" }, { "2.", "BACKUP FRAM (CNC -> EXTERNAL MEMORY)" }, }; static const char* memory_format_text[][2] = { { "1.", "END" }, { "2.", "EXTERNAL MEMORY SD" }, { "3.", "EXTERNAL MEMORY USB" }, { "4.", "CNC PROG MEMORY" }, }; static const char* from_data_text[][2] = { { "1.", "END" }, { "2.", "BACKUP INTERNAL MEMORY (CNC -> EXTERNAL MEMORY)" }, }; static const char* boot_screen_text[][2] = { { "1.", "END" }, { "2.", "BOOT SCREEN DISPLAY MODE :" }, { "3.", "BOOT SCREEN PREVIEW" }, }; static const char* auth_text[][2] = { { "1.", "END" }, { "2.", "PASSWORD :" }, { "3.", "LOGIN" }, }; static void _select_main (int Sel, WM_HWIN hItem) { select_num = Sel; switch (Sel) { case 0: break; case 1: for (int i = 0; i < GUI_COUNTOF (system_backup_text); i++) { LISTVIEW_AddRow (hItem, NULL); LISTVIEW_SetItemText (hItem, 0, i, system_backup_text[i][0]); LISTVIEW_SetItemText (hItem, 1, i, system_backup_text[i][1]); } break; case 2: for (int i = 0; i < GUI_COUNTOF (system_restore_text); i++) { LISTVIEW_AddRow (hItem, NULL); LISTVIEW_SetItemText (hItem, 0, i, system_restore_text[i][0]); LISTVIEW_SetItemText (hItem, 1, i, system_restore_text[i][1]); } break; case 3: for (int i = 0; i < GUI_COUNTOF (system_update_text); i++) { LISTVIEW_AddRow (hItem, NULL); LISTVIEW_SetItemText (hItem, 0, i, system_update_text[i][0]); LISTVIEW_SetItemText (hItem, 1, i, system_update_text[i][1]); } break; case 4: for (int i = 0; i < GUI_COUNTOF (nvmem_data_text); i++) { LISTVIEW_AddRow (hItem, NULL); LISTVIEW_SetItemText (hItem, 0, i, nvmem_data_text[i][0]); LISTVIEW_SetItemText (hItem, 1, i, nvmem_data_text[i][1]); } break; case 5: for (int i = 0; i < GUI_COUNTOF (fram_data_text); i++) { LISTVIEW_AddRow (hItem, NULL); LISTVIEW_SetItemText (hItem, 0, i, fram_data_text[i][0]); LISTVIEW_SetItemText (hItem, 1, i, fram_data_text[i][1]); } break; case 6: for (int i = 0; i < GUI_COUNTOF (memory_format_text); i++) { LISTVIEW_AddRow (hItem, NULL); LISTVIEW_SetItemText (hItem, 0, i, memory_format_text[i][0]); LISTVIEW_SetItemText (hItem, 1, i, memory_format_text[i][1]); } break; case 7: for (int i = 0; i < GUI_COUNTOF (from_data_text); i++) { LISTVIEW_AddRow (hItem, NULL); LISTVIEW_SetItemText (hItem, 0, i, from_data_text[i][0]); LISTVIEW_SetItemText (hItem, 1, i, from_data_text[i][1]); } break; case 8: for (int i = 0; i < GUI_COUNTOF (boot_screen_text); i++) { LISTVIEW_AddRow (hItem, NULL); LISTVIEW_SetItemText (hItem, 0, i, boot_screen_text[i][0]); LISTVIEW_SetItemText (hItem, 1, i, boot_screen_text[i][1]); } break; case 9: for (int i = 0; i < GUI_COUNTOF (auth_text); i++) { LISTVIEW_AddRow (hItem, NULL); LISTVIEW_SetItemText (hItem, 0, i, auth_text[i][0]); LISTVIEW_SetItemText (hItem, 1, i, auth_text[i][1]); } break; } } static void _select_next (int Sel, WM_HWIN hItem) { if (Sel == 1) { for (int i = 0; i < GUI_COUNTOF (main_text); i++) { LISTVIEW_AddRow (hItem, NULL); LISTVIEW_SetItemText (hItem, 0, i, main_text[i][0]); LISTVIEW_SetItemText (hItem, 1, i, main_text[i][1]); } } else if (Sel == 2) { switch (select_num) { } } else if (Sel == 3) { switch (select_num) { } } else if (Sel == 4) { switch (select_num) { } } else if (Sel == 5) { switch (select_num) { } } else if (Sel == 6) { switch (select_num) { } } } static void _cbDialog (WM_MESSAGE* pMsg) { WM_HWIN hItem; int NCode = 0; int Id; HWND hListview; switch (pMsg->MsgId) { case WM_INIT_DIALOG: hItem = WM_GetDialogItem (pMsg->hWin, ID_LISTVIEW_0); LISTVIEW_AddColumn (hItem, 20, "1", GUI_TA_LEFT); LISTVIEW_AddColumn (hItem, 280, "2", GUI_TA_LEFT); LISTVIEW_SetHeaderHeight (hItem, 0); LISTVIEW_SetGridVis (hItem, 0); int FontHeight = GUI_GetFontDistY (); WIDGET_SetEffect (hItem, &WIDGET_Effect_None); LISTVIEW_SetRowHeight (hItem, FontHeight + 13); LISTVIEW_SetFont (hItem, GUI_FONT_16_ASCII); for (int i = 0; i < GUI_COUNTOF (main_text); i++) { LISTVIEW_AddRow (hItem, NULL); LISTVIEW_SetItemText (hItem, 0, i, main_text[i][0]); LISTVIEW_SetItemText (hItem, 1, i, main_text[i][1]); } hItem = WM_GetDialogItem (pMsg->hWin, ID_BUTTON_0); BUTTON_SetFont (hItem, GUI_FONT_13_ASCII); BUTTON_SetText (hItem, "[SELECT]"); BUTTON_SetFrameColor (hItem, GUI_WHITE); BUTTON_SetBkColor (hItem, BUTTON_CI_PRESSED, GUI_WHITE); BUTTON_SetBkColor (hItem, BUTTON_CI_UNPRESSED, GUI_WHITE); BUTTON_SetFocusColor (hItem, GUI_WHITE); hItem = WM_GetClientWindow (pMsg->hWin); WM_InvalidateWindow (hItem); case WM_PAINT: GUI_SetBkColor (GUI_WHITE); GUI_Clear (); const GUI_FONT* pOldFont = GUI_GetFont (); GUI_SetFont (&GUI_Font32B_ASCII); GUI_SetColor (GUI_BLACK); GUI_SetTextMode (GUI_TM_NORMAL); GUI_DispStringAt ("SYSTEM MAINTAIN MAIN MENU", 0, 0); GUI_SetFont (pOldFont); break; case WM_NOTIFY_PARENT: Id = WM_GetId (pMsg->hWinSrc); NCode = pMsg->Data.v; switch (Id) { case ID_LISTVIEW_0: switch (NCode) { case WM_NOTIFICATION_CLICKED: break; case WM_NOTIFICATION_RELEASED: break; case WM_NOTIFICATION_SEL_CHANGED: break; } break; case ID_BUTTON_0: switch (NCode) { case WM_NOTIFICATION_CLICKED: break; case WM_NOTIFICATION_RELEASED: hListview = WM_GetDialogItem (pMsg->hWin, ID_LISTVIEW_0); int Sel = LISTVIEW_GetSel (hListview); if (Sel < 0 || Sel > 12) break; LISTVIEW_DeleteAllRows (hListview); (is_main == 0) ? _select_main (Sel, hListview) : _select_next (Sel, hListview); break; default: WM_DefaultProc (pMsg); return; } break; } break; default: WM_DefaultProc (pMsg); break; } } WM_HWIN CreateFramewin (void) { WM_HWIN hWin; hWin = GUI_CreateDialogBox (_aDialogCreate, GUI_COUNTOF (_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0); return hWin; } void MainTask (void) { BUTTON_SetDefaultSkinClassic (); WM_SetCreateFlags (WM_CF_MEMDEV); CreateFramewin (); while (1) { GUI_Delay (50); } } DWORD WINAPI MYTASK (LPVOID lpParam) { MainTask (); return 0; } LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rect; static int counter = 0; switch (msg) { case WM_PAINT: break; case WM_DESTROY: PostQuitMessage (0); break; default: return DefWindowProc (hwnd, msg, wParam, lParam); } return 0; } int APIENTRY WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER (hPrevInstance); UNREFERENCED_PARAMETER (lpCmdLine); const char CLASS_NAME[] = "MyGDIWindowClass"; WNDCLASSEX wc = { 0 }; wc.cbSize = sizeof (WNDCLASSEX); wc.lpfnWndProc = WndProc; // 消息处理函数 wc.hInstance = hInstance; wc.lpszClassName = CLASS_NAME; wc.hCursor = LoadCursor (NULL, IDC_ARROW); // 默认箭头光标 wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); // 初始背景(会被 WM_PAINT 覆盖) wc.style = CS_HREDRAW | CS_VREDRAW; // 大小改变时重绘 RegisterClassEx (&wc); HWND hwnd = CreateWindowEx ( 0, // 扩展样式 CLASS_NAME, // 类名 L"123", // 窗口标题 WS_OVERLAPPEDWINDOW, // 窗口样式 CW_USEDEFAULT, CW_USEDEFAULT, // x, y 位置 800, 480, // 宽高 NULL, // 父窗口(无) NULL, // 菜单(无) hInstance, // 实例句柄 NULL // 额外参数 ); if (!hwnd) return 0; SIM_GUI_Enable (); GUI_Init (); InitGraphics (hwnd); ShowWindow (hwnd, nCmdShow); UpdateWindow (hwnd); CreateThread (NULL, 0, MYTASK, NULL, 0, NULL); MSG msg; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return (int)msg.wParam; } 出来的是白板,请加上刷新函数
最新发布
10-17
#include <windows.h> #include "GUI.H" #include "DIALOG.h" #include "LISTVIEW.h" #include "GUI_SIM_Win32.h" #include "LCD_SIM.H" #include "gdi.h" HWND ghWndMain = NULL; int is_main = 0; int select_num = 0; #define ID_BUTTON_0 (GUI_ID_USER + 0x00) #define ID_LISTVIEW_0 (GUI_ID_USER + 0x01) #define ID_WINDOW_0 (GUI_ID_USER + 0x02) static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = { {WINDOW_CreateIndirect, "MainPanel", ID_WINDOW_0, 0, 0, 800, 480, 0, 0x0, 0 }, {BUTTON_CreateIndirect, "Button", ID_BUTTON_0, 40, 420, 60, 15, 0, 0x0, 0 }, {LISTVIEW_CreateIndirect, "Listview", ID_LISTVIEW_0, 0, 50, 400, 300,0, 0x0, 0 }, }; static const char* main_text[][2] = { { "1.", "END" }, { "2.", "SYSTEM BACKUP AND DATA EXPORT" }, { "3.", "SYSTEM RESTORE AND DATA IMPORT" }, { "4.", "SYSTEM UPDATE" }, { "5.", "NVEME DATA UTILITY" }, { "6.", "FRAM DATA UTILITY" }, { "7.", "MEMORY FORMAT" }, { "8.", "FROM DATA UTILITY" }, { "9.", "BOOT SCREEN" }, { "10.", "AUTH" } }; static const char* system_backup_text[][2] = { { "1.", "END" }, { "2.", "BACKUP CNC (*.BAK)" }, { "3.", "EXPORT CNC PROGRAM (PRG.BIN)" }, { "4.", "EXPORT PLC LADDER (LADDER.ZIP)" }, }; static const char* system_restore_text[][2] = { { "1.", "END" }, { "2.", "RESTORE CNC (*.BAK)" }, { "3.", "IMPORT CNC PROGRAM (PRG.BIN)" }, { "4.", "IMPORT PLC LADDER (LADDER.ZIP)" }, }; static const char * system_update_text[][2] = { { "1.", "END" }, }; static const char* nvmem_data_text[][2] = { { "1.", "END" }, { "2.", "BACKUP (CNC -> EXTERNAL MEMORY)" }, { "3.", "RESTORE (EXTERNAL MEMORY -> CNC)" }, { "4.", "RESTORE (AUTO BACKUP -> CNC)" }, { "5.", "FORMAT" }, }; static const char* fram_data_text[][2] = { { "1.", "END" }, { "2.", "BACKUP FRAM (CNC -> EXTERNAL MEMORY)" }, }; static const char* memory_format_text[][2] = { { "1.", "END" }, { "2.", "EXTERNAL MEMORY SD" }, { "3.", "EXTERNAL MEMORY USB" }, { "4.", "CNC PROG MEMORY" }, }; static const char* from_data_text[][2] = { { "1.", "END" }, { "2.", "BACKUP INTERNAL MEMORY (CNC -> EXTERNAL MEMORY)" }, }; static const char* boot_screen_text[][2] = { { "1.", "END" }, { "2.", "BOOT SCREEN DISPLAY MODE :" }, { "3.", "BOOT SCREEN PREVIEW" }, }; static const char* auth_text[][2] = { { "1.", "END" }, { "2.", "PASSWORD :" }, { "3.", "LOGIN" }, }; static void _select_main (int Sel, WM_HWIN hItem) { select_num = Sel; switch (Sel) { case 0 : break; case 1: for (int i = 0; i < GUI_COUNTOF (system_backup_text); i++) { LISTVIEW_AddRow (hItem, NULL); LISTVIEW_SetItemText (hItem, 0, i, system_backup_text[i][0]); LISTVIEW_SetItemText (hItem, 1, i, system_backup_text[i][1]); } break; case 2: for (int i = 0; i < GUI_COUNTOF (system_restore_text); i++) { LISTVIEW_AddRow (hItem, NULL); LISTVIEW_SetItemText (hItem, 0, i, system_restore_text[i][0]); LISTVIEW_SetItemText (hItem, 1, i, system_restore_text[i][1]); } break; case 3: for (int i = 0; i < GUI_COUNTOF (system_update_text); i++) { LISTVIEW_AddRow (hItem, NULL); LISTVIEW_SetItemText (hItem, 0, i, system_update_text[i][0]); LISTVIEW_SetItemText (hItem, 1, i, system_update_text[i][1]); } break; case 4: for (int i = 0; i < GUI_COUNTOF (nvmem_data_text); i++) { LISTVIEW_AddRow (hItem, NULL); LISTVIEW_SetItemText (hItem, 0, i, nvmem_data_text[i][0]); LISTVIEW_SetItemText (hItem, 1, i, nvmem_data_text[i][1]); } break; case 5: for (int i = 0; i < GUI_COUNTOF (fram_data_text); i++) { LISTVIEW_AddRow (hItem, NULL); LISTVIEW_SetItemText (hItem, 0, i, fram_data_text[i][0]); LISTVIEW_SetItemText (hItem, 1, i, fram_data_text[i][1]); } break; case 6: for (int i = 0; i < GUI_COUNTOF (memory_format_text); i++) { LISTVIEW_AddRow (hItem, NULL); LISTVIEW_SetItemText (hItem, 0, i, memory_format_text[i][0]); LISTVIEW_SetItemText (hItem, 1, i, memory_format_text[i][1]); } break; case 7: for (int i = 0; i < GUI_COUNTOF (from_data_text); i++) { LISTVIEW_AddRow (hItem, NULL); LISTVIEW_SetItemText (hItem, 0, i, from_data_text[i][0]); LISTVIEW_SetItemText (hItem, 1, i, from_data_text[i][1]); } break; case 8: for (int i = 0; i < GUI_COUNTOF (boot_screen_text); i++) { LISTVIEW_AddRow (hItem, NULL); LISTVIEW_SetItemText (hItem, 0, i, boot_screen_text[i][0]); LISTVIEW_SetItemText (hItem, 1, i, boot_screen_text[i][1]); } break; case 9: for (int i = 0; i < GUI_COUNTOF (auth_text); i++) { LISTVIEW_AddRow (hItem, NULL); LISTVIEW_SetItemText (hItem, 0, i, auth_text[i][0]); LISTVIEW_SetItemText (hItem, 1, i, auth_text[i][1]); } break; } } static void _select_next (int Sel, WM_HWIN hItem) { if (Sel == 1) { for (int i = 0; i < GUI_COUNTOF (main_text); i++) { LISTVIEW_AddRow (hItem, NULL); LISTVIEW_SetItemText (hItem, 0, i, main_text[i][0]); LISTVIEW_SetItemText (hItem, 1, i, main_text[i][1]); } } else if (Sel == 2) { switch (select_num) { } } else if (Sel == 3) { switch (select_num) { } } else if (Sel == 4) { switch (select_num) { } } else if (Sel == 5) { switch (select_num) { } } else if (Sel == 6) { switch (select_num) { } } } void TestDrawing () { BeginDraw (); // 清除为黑色背景,确保可见 ClearCanvas (RGB (0, 0, 0)); // 绘制明显的红色矩形 for (int x = 50; x < 150; x++) { for (int y = 50; y < 150; y++) { DrawPixel (x, y, RGB (255, 0, 0)); } } // 绘制一些绿色点 for (int i = 0; i < 20; i++) { DrawPixelWithBrush (200 + i * 5, 100, RGB (0, 255, 0)); } EndDraw (); // 立即显示 } static void _cbDialog (WM_MESSAGE* pMsg) { WM_HWIN hItem; int NCode = 0; int Id; HWND hListview; switch (pMsg->MsgId) { case WM_INIT_DIALOG : BeginDraw (); hItem = WM_GetDialogItem (pMsg->hWin, ID_LISTVIEW_0); LISTVIEW_AddColumn (hItem, 20, "1", GUI_TA_LEFT); LISTVIEW_AddColumn (hItem, 280, "2", GUI_TA_LEFT); LISTVIEW_SetHeaderHeight (hItem, 0); LISTVIEW_SetGridVis (hItem, 0); int FontHeight = GUI_GetFontDistY (); WIDGET_SetEffect (hItem, &WIDGET_Effect_None); LISTVIEW_SetRowHeight (hItem, FontHeight + 13); LISTVIEW_SetFont (hItem, GUI_FONT_16_ASCII); for (int i = 0; i < GUI_COUNTOF (main_text); i++) { LISTVIEW_AddRow (hItem, NULL); LISTVIEW_SetItemText (hItem, 0, i, main_text[i][0]); LISTVIEW_SetItemText (hItem, 1, i, main_text[i][1]); } hItem = WM_GetDialogItem (pMsg->hWin, ID_BUTTON_0); BUTTON_SetFont (hItem, GUI_FONT_13_ASCII); BUTTON_SetText (hItem, "[SELECT]"); BUTTON_SetFrameColor (hItem, GUI_WHITE); BUTTON_SetBkColor (hItem, BUTTON_CI_PRESSED, GUI_WHITE); BUTTON_SetBkColor (hItem, BUTTON_CI_UNPRESSED,GUI_WHITE); BUTTON_SetFocusColor (hItem, GUI_WHITE); hItem = pMsg->hWin; GUI_SetBkColor (GUI_WHITE); GUI_Clear (); const GUI_FONT* pOldFont = GUI_GetFont (); GUI_SetFont (&GUI_Font32B_ASCII); GUI_SetColor (GUI_BLACK); GUI_SetTextMode (GUI_TM_NORMAL); GUI_DispStringAt ("SYSTEM MAINTAIN MAIN MENU", 0, 0); GUI_SetFont (pOldFont); //hItem = WM_GetClientWindow(pMsg->hWin); //WM_InvalidateWindow (hItem); EndDraw (); break; case WM_PAINT: BeginDraw (); EndDraw (); break; case WM_NOTIFY_PARENT: Id = WM_GetId (pMsg->hWinSrc); NCode = pMsg->Data.v; switch (Id) { case ID_LISTVIEW_0: switch (NCode) { case WM_NOTIFICATION_CLICKED: break; case WM_NOTIFICATION_RELEASED: break; case WM_NOTIFICATION_SEL_CHANGED: break; } break; case ID_BUTTON_0: switch (NCode) { case WM_NOTIFICATION_CLICKED: break; case WM_NOTIFICATION_RELEASED: hListview = WM_GetDialogItem (pMsg->hWin, ID_LISTVIEW_0); int Sel = LISTVIEW_GetSel (hListview); if (Sel < 0 || Sel > 12) break; LISTVIEW_DeleteAllRows (hListview); (is_main == 0) ? _select_main (Sel, hListview) : _select_next (Sel, hListview); break; default: WM_DefaultProc (pMsg); return; } break; } break; default: WM_DefaultProc (pMsg); break; } } WM_HWIN CreateFramewin (void) { WM_HWIN hWin; hWin = GUI_CreateDialogBox (_aDialogCreate, GUI_COUNTOF (_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0); return hWin; } void MainTask (void) { BUTTON_SetDefaultSkinClassic (); WM_SetCreateFlags (WM_CF_MEMDEV); CreateFramewin (); while (1) { GUI_Delay (50); } } DWORD WINAPI MYTASK (LPVOID lpParam) { MainTask (); return 0; } LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rect; static int counter = 0; switch (msg) { case WM_CREATE: //InitGraphics (hwnd); SetTimer (hwnd, 1, 10, NULL); break; case WM_TIMER: InvalidateRect (hwnd, NULL, FALSE); break; case WM_PAINT: BeginPaint (hwnd, &ps); BeginDraw (); EndDraw (); EndPaint (hwnd, &ps); break; case WM_DESTROY: PostQuitMessage (0); break; default: return DefWindowProc (hwnd, msg, wParam, lParam); } return 0; } int APIENTRY WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER (hPrevInstance); UNREFERENCED_PARAMETER (lpCmdLine); const char CLASS_NAME[] = "MyGDIWindowClass"; WNDCLASSEX wc = { 0 }; wc.cbSize = sizeof (WNDCLASSEX); wc.lpfnWndProc = WndProc; // 消息处理函数 wc.hInstance = hInstance; wc.lpszClassName = CLASS_NAME; wc.hCursor = LoadCursor (NULL, IDC_ARROW); // 默认箭头光标 wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); // 初始背景(会被 WM_PAINT 覆盖) wc.style = CS_HREDRAW | CS_VREDRAW; // 大小改变时重绘 RegisterClassEx (&wc); HWND hwnd = CreateWindowEx ( 0, // 扩展样式 CLASS_NAME, // 类名 L"123", // 窗口标题 WS_OVERLAPPEDWINDOW, // 窗口样式 CW_USEDEFAULT, CW_USEDEFAULT, // x, y 位置 800, 480, // 宽高 NULL, // 父窗口(无) NULL, // 菜单(无) hInstance, // 实例句柄 NULL // 额外参数 ); SIM_GUI_Enable (); GUI_Init (); InitGraphics(hwnd); //DrawPixelWithBrush (100,200,RGB(255,0,0)); if (!hwnd) return 0; ShowWindow (hwnd, nCmdShow); UpdateWindow (hwnd); CreateThread (NULL, 0, MYTASK, NULL, 0, NULL); MSG msg; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return (int)msg.wParam; } 为什么绘出的图很奇怪
10-17
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值