From b4d691ba969d796acebfed01649498bc437914b0 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Wed, 22 Nov 2017 11:14:49 +0200 Subject: [PATCH] [BUTTONVISTEST] Add visual tests for buttons --- modules/rostests/win32/CMakeLists.txt | 1 + .../rostests/win32/comctl32/CMakeLists.txt | 1 + .../win32/comctl32/buttonvistest/143.bmp | Bin 0 -> 2054 bytes .../win32/comctl32/buttonvistest/225.bmp | Bin 0 -> 6198 bytes .../comctl32/buttonvistest/CMakeLists.txt | 4 + .../comctl32/buttonvistest/Win32Project1.ico | Bin 0 -> 46227 bytes .../comctl32/buttonvistest/buttonvistest.cpp | 419 ++++++++++++++++++ .../comctl32/buttonvistest/buttonvistest.rc | 65 +++ .../comctl32/buttonvistest/comctl6.manifest | 25 ++ .../win32/comctl32/buttonvistest/resource.h | 38 ++ .../win32/comctl32/buttonvistest/small.ico | Bin 0 -> 46227 bytes 11 files changed, 553 insertions(+) create mode 100644 modules/rostests/win32/comctl32/CMakeLists.txt create mode 100644 modules/rostests/win32/comctl32/buttonvistest/143.bmp create mode 100644 modules/rostests/win32/comctl32/buttonvistest/225.bmp create mode 100644 modules/rostests/win32/comctl32/buttonvistest/CMakeLists.txt create mode 100644 modules/rostests/win32/comctl32/buttonvistest/Win32Project1.ico create mode 100644 modules/rostests/win32/comctl32/buttonvistest/buttonvistest.cpp create mode 100644 modules/rostests/win32/comctl32/buttonvistest/buttonvistest.rc create mode 100644 modules/rostests/win32/comctl32/buttonvistest/comctl6.manifest create mode 100644 modules/rostests/win32/comctl32/buttonvistest/resource.h create mode 100644 modules/rostests/win32/comctl32/buttonvistest/small.ico diff --git a/modules/rostests/win32/CMakeLists.txt b/modules/rostests/win32/CMakeLists.txt index 7fc9c96f732..bf71c98bebd 100644 --- a/modules/rostests/win32/CMakeLists.txt +++ b/modules/rostests/win32/CMakeLists.txt @@ -1,4 +1,5 @@ add_subdirectory(advapi32) add_subdirectory(cmd) +add_subdirectory(comctl32) add_subdirectory(kernel32) add_subdirectory(user32) diff --git a/modules/rostests/win32/comctl32/CMakeLists.txt b/modules/rostests/win32/comctl32/CMakeLists.txt new file mode 100644 index 00000000000..28bb44b288c --- /dev/null +++ b/modules/rostests/win32/comctl32/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(buttonvistest) diff --git a/modules/rostests/win32/comctl32/buttonvistest/143.bmp b/modules/rostests/win32/comctl32/buttonvistest/143.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f1a0b199ab1c0d5ae1e9ee543b30f9ed63bd0daf GIT binary patch literal 2054 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 F{|^Y_%TE9R literal 0 HcmV?d00001 diff --git a/modules/rostests/win32/comctl32/buttonvistest/CMakeLists.txt b/modules/rostests/win32/comctl32/buttonvistest/CMakeLists.txt new file mode 100644 index 00000000000..16a707dd399 --- /dev/null +++ b/modules/rostests/win32/comctl32/buttonvistest/CMakeLists.txt @@ -0,0 +1,4 @@ +add_executable(buttonvistest buttonvistest.cpp buttonvistest.rc) +set_module_type(buttonvistest win32gui UNICODE) +add_delay_importlibs(buttonvistest comctl32) +add_importlibs(buttonvistest uxtheme user32 gdi32 advapi32 msvcrt kernel32) diff --git a/modules/rostests/win32/comctl32/buttonvistest/Win32Project1.ico b/modules/rostests/win32/comctl32/buttonvistest/Win32Project1.ico new file mode 100644 index 0000000000000000000000000000000000000000..b3ec03bd617f32e58128fa977fd6ac9605124f4b GIT binary patch literal 46227 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 +#include +#include +#include +#include "resource.h" + +LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); + +HICON hico; +HBITMAP hbmp; +HIMAGELIST himl; +POINT scPos; + +HBRUSH hbrNULL; +HBRUSH hbrRed; +HBRUSH hbrGreen; +HBRUSH hbrBlue; +HBRUSH hbrCyan; +HBRUSH hbrYellow; + +HBRUSH hbrCtlColorStatic; +HBRUSH hbrCtlColorBtn; +HBRUSH hbrPrintClientClear; +HBRUSH hbrErase; + +BOOL bSkipErase; +BOOL bSkipPaint; + +static void RegisterMyClass(HINSTANCE hInst) +{ + WNDCLASSEXW wcex; + + wcex.cbSize = sizeof(WNDCLASSEX); + + wcex.style = CS_HREDRAW | CS_VREDRAW; + wcex.lpfnWndProc = WndProc; + wcex.cbClsExtra = 0; + wcex.cbWndExtra = 0; + wcex.hInstance = hInst; + wcex.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_WIN32PROJECT1)); + wcex.hCursor = LoadCursor(NULL, IDC_ARROW); + wcex.hbrBackground = NULL; + wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_MENU); + wcex.lpszClassName = L"ButtonTests"; + wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); + + RegisterClassExW(&wcex); +} + +#define TOP_MARGIN 50 +#define LEFT_MARGIN 160 +#define X_GAP 10 +#define Y_GAP 10 +#define Y_HEIGHT 40 +#define X_WIDTH 150 + +static HWND CreateWnd(HWND hWnd, LPCWSTR Class, LPCWSTR Text, LONG style, int i, int j) +{ + return CreateWindowW(Class, + Text, + style | WS_CHILD | WS_VISIBLE, + LEFT_MARGIN + (X_GAP + X_WIDTH) * i, + TOP_MARGIN + ((Y_GAP + Y_HEIGHT) *j), + X_WIDTH, + Y_HEIGHT, + hWnd, NULL, NULL, NULL); +} + +static HWND CreateBtn(HWND hWnd, LPCWSTR Text, LONG style, int i, int j) +{ + WCHAR buffer[100]; + SIZE s; + + HWND ret = CreateWnd(hWnd, L"Button", Text, style, i, j); + if (GetWindowLongW(ret, GWL_STYLE) != (style | WS_CHILD | WS_VISIBLE)) + { + swprintf(buffer, L"expected 0x%x got 0x%x", (style | WS_CHILD | WS_VISIBLE), GetWindowLongW(ret, GWL_STYLE)); + MessageBox(0, buffer, L"error", MB_OK); + } + + if (SendMessageW(ret, BCM_GETIDEALSIZE, 0, (LPARAM)&s)) + { + swprintf(buffer, L"%s (%d, %d)", Text, s.cx, s.cy); + SendMessageW(ret, WM_SETTEXT, 0, (LPARAM)buffer); + } + return ret; +} + +static void CreateButtonSet(HWND hwndParent, HWND *ahwnd, int i, int j, DWORD style) +{ + ahwnd[0] = CreateBtn(hwndParent, L"TestButton", style, i, j + 0); + ahwnd[1] = CreateBtn(hwndParent, L"TestButton1", style, i, j + 1); + ahwnd[2] = CreateBtn(hwndParent, L"TestButton2", style, i, j + 2); + ahwnd[3] = CreateBtn(hwndParent, L"TestButton3", style | BS_BITMAP, i, j + 3); + ahwnd[4] = CreateBtn(hwndParent, L"TestButton4", style | BS_ICON, i, j + 4); + + SendMessageW(ahwnd[1], BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hbmp); + SendMessageW(ahwnd[2], BM_SETIMAGE, IMAGE_ICON, (LPARAM)hico); + + SendMessageW(ahwnd[3], BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hbmp); + SendMessageW(ahwnd[4], BM_SETIMAGE, IMAGE_ICON, (LPARAM)hico); +} + +int WINAPI wWinMain(_In_ HINSTANCE hInstance, + _In_opt_ HINSTANCE hPrevInstance, + _In_ LPWSTR lpCmdLine, + _In_ int nCmdShow) +{ + HWND hwnd[200]; + HANDLE hActCtx; + ULONG_PTR cookie; + BOOL bActivated; + + ACTCTXW actctx = { sizeof(actctx) }; + actctx.hModule = hInstance; + actctx.dwFlags = ACTCTX_FLAG_RESOURCE_NAME_VALID| ACTCTX_FLAG_HMODULE_VALID; + actctx.lpResourceName = MAKEINTRESOURCEW(500); + hActCtx = CreateActCtxW(&actctx); + + hico = LoadIconW(hInstance, MAKEINTRESOURCEW(IDI_WIN32PROJECT1)); + hbmp = LoadBitmapW(hInstance, MAKEINTRESOURCEW(IDB_BITMAP1)); + + scPos.x = 0; + scPos.y = 0; + + hbrNULL = (HBRUSH)GetStockObject (NULL_BRUSH); + hbrRed = CreateSolidBrush(0x00000FF); + hbrGreen = CreateSolidBrush(0x0000FF00); + hbrBlue = CreateSolidBrush(0x00FF0000); + hbrCyan = CreateSolidBrush(0x00FFFF00); + hbrYellow = CreateSolidBrush(0x0000FFFF); + + hbrCtlColorStatic = hbrRed; + hbrCtlColorBtn = hbrCyan; + hbrPrintClientClear = hbrYellow; + hbrErase = hbrGreen; + + bSkipErase = FALSE; + bSkipPaint = FALSE; + + RegisterMyClass(hInstance); + + HWND hWnd = CreateWindowExW(WS_EX_CLIENTEDGE, L"ButtonTests", L"Button tests", WS_OVERLAPPEDWINDOW| WS_HSCROLL| WS_VSCROLL, + CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); + + CreateWnd(hWnd, L"Static", L"no images", 0, -1, 0); + CreateWnd(hWnd, L"Static", L"with BM_SETIMAGE", 0, -1, 1); + CreateWnd(hWnd, L"Static", L"with BM_SETIMAGE", 0, -1, 2); + CreateWnd(hWnd, L"Static", L"with BM_SETIMAGE and BS_BITMAP", 0, -1, 3); + CreateWnd(hWnd, L"Static", L"with BM_SETIMAGE and BS_ICON", 0, -1, 4); + + CreateWnd(hWnd, L"Static", L"Button V5", 0, 0, -1); + CreateButtonSet(hWnd, &hwnd[0], 0, 0, BS_PUSHBUTTON); + CreateButtonSet(hWnd, &hwnd[5], 1, 0, BS_DEFPUSHBUTTON); + CreateButtonSet(hWnd, &hwnd[10], 0, 5, BS_PUSHBUTTON|WS_DISABLED); + CreateButtonSet(hWnd, &hwnd[15], 1, 5, BS_GROUPBOX); + CreateButtonSet(hWnd, &hwnd[20], 0, 10, BS_CHECKBOX); + CreateButtonSet(hWnd, &hwnd[25], 1, 10, BS_RADIOBUTTON); + + bActivated = ActivateActCtx(hActCtx, &cookie); + LoadLibraryW(L"comctl32.dll"); + + himl = ImageList_LoadImageW(hInstance, MAKEINTRESOURCEW(IDB_BITMAP2), 16, 0, CLR_DEFAULT, IMAGE_BITMAP, LR_CREATEDIBSECTION); + BUTTON_IMAGELIST btniml = {himl, {1,1,1,1}, BUTTON_IMAGELIST_ALIGN_LEFT}; + + CreateWnd(hWnd, L"Static", L"Button V6 without themes", 0, 2, -1); + CreateButtonSet(hWnd, &hwnd[30], 2, 0, BS_PUSHBUTTON); + CreateButtonSet(hWnd, &hwnd[35], 3, 0, BS_DEFPUSHBUTTON); + CreateButtonSet(hWnd, &hwnd[40], 2, 5, BS_PUSHBUTTON|WS_DISABLED); + CreateButtonSet(hWnd, &hwnd[55], 3, 5, BS_GROUPBOX); + CreateButtonSet(hWnd, &hwnd[50], 2, 10, BS_CHECKBOX); + CreateButtonSet(hWnd, &hwnd[55], 3, 10, BS_RADIOBUTTON); + + CreateWnd(hWnd, L"Static", L"Button V6 with imagelist and no themes", 0, 4, -1); + CreateButtonSet(hWnd, &hwnd[60], 4, 0, BS_PUSHBUTTON); + CreateButtonSet(hWnd, &hwnd[65], 5, 0, BS_DEFPUSHBUTTON); + CreateButtonSet(hWnd, &hwnd[70], 4, 5, BS_PUSHBUTTON|WS_DISABLED); + CreateButtonSet(hWnd, &hwnd[75], 5, 5, BS_GROUPBOX); + CreateButtonSet(hWnd, &hwnd[80], 4, 10, BS_CHECKBOX); + CreateButtonSet(hWnd, &hwnd[85], 5, 10, BS_RADIOBUTTON); + + for (int i = 30; i < 90; i++) + SetWindowTheme(hwnd[i], L"", L""); + + for (int i = 60; i< 90; i++) + SendMessageW(hwnd[i], BCM_SETIMAGELIST, 0, (LPARAM)&btniml); + + CreateWnd(hWnd, L"Static", L"Button V6 with themes and imagelist", 0, 6, -1); + CreateButtonSet(hWnd, &hwnd[120], 6, 0, BS_PUSHBUTTON); + CreateButtonSet(hWnd, &hwnd[125], 7, 0, BS_DEFPUSHBUTTON); + CreateButtonSet(hWnd, &hwnd[130], 6, 5, BS_PUSHBUTTON|WS_DISABLED); + CreateButtonSet(hWnd, &hwnd[135], 7, 5, BS_GROUPBOX); + CreateButtonSet(hWnd, &hwnd[140], 6, 10, BS_CHECKBOX); + CreateButtonSet(hWnd, &hwnd[145], 7, 10, BS_RADIOBUTTON); + + CreateWnd(hWnd, L"Static", L"Button V6 with themes", 0, 8, -1); + CreateButtonSet(hWnd, &hwnd[90], 8, 0, BS_PUSHBUTTON); + CreateButtonSet(hWnd, &hwnd[95], 9, 0, BS_DEFPUSHBUTTON); + CreateButtonSet(hWnd, &hwnd[100], 8, 5, BS_PUSHBUTTON|WS_DISABLED); + CreateButtonSet(hWnd, &hwnd[105], 9, 5, BS_GROUPBOX); + CreateButtonSet(hWnd, &hwnd[110], 8, 10, BS_CHECKBOX); + CreateButtonSet(hWnd, &hwnd[115], 9, 10, BS_RADIOBUTTON); + + for (int i = 120; i< 150; i++) + SendMessageW(hwnd[i], BCM_SETIMAGELIST, 0, (LPARAM)&btniml); + + if (bActivated) DeactivateActCtx(0, cookie); + + SCROLLINFO vsi = {sizeof(SCROLLINFO), SIF_ALL, 0, 2 * TOP_MARGIN + 10 * (Y_GAP + Y_HEIGHT), Y_HEIGHT, 0, 0}; + SCROLLINFO hsi = {sizeof(SCROLLINFO), SIF_ALL, 0, 2 * LEFT_MARGIN + 13 * (X_GAP + X_WIDTH), X_WIDTH, 0, 0}; + + SetScrollInfo(hWnd, SB_HORZ, &hsi, FALSE); + SetScrollInfo(hWnd, SB_VERT, &vsi, FALSE); + + ShowScrollBar(hWnd, SB_HORZ, TRUE); + ShowScrollBar(hWnd, SB_VERT, TRUE); + + ShowWindow(hWnd, nCmdShow); + UpdateWindow(hWnd); + + MSG msg; + while (GetMessage(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + return (int) msg.wParam; +} + +static VOID +OnScroll(HWND hwnd, INT nBar, WORD sbCode) +{ + RECT rect; + + SCROLLINFO sInfo; + INT oldPos, Maximum; + PLONG pOriginXY; + + //ASSERT(nBar == SB_HORZ || nBar == SB_VERT); + + GetClientRect(hwnd, &rect); + + if (nBar == SB_HORZ) + { + Maximum =1000;//pData->cxMin - (rect.right-rect.left) /* pData->cxOld */; + pOriginXY = &scPos.x; + } + else // if (nBar == SB_VERT) + { + Maximum = 1000;//pData->cyMin - (rect.bottom-rect.top) /* pData->cyOld */; + pOriginXY = &scPos.y; + } + + /* Set scrollbar sizes */ + sInfo.cbSize = sizeof(sInfo); + sInfo.fMask = SIF_RANGE | SIF_POS | SIF_PAGE | SIF_TRACKPOS; + + if (!GetScrollInfo(hwnd, nBar, &sInfo)) + return; + + oldPos = sInfo.nPos; + + switch (sbCode) + { + case SB_LINEUP: // SB_LINELEFT: + sInfo.nPos--; + break; + + case SB_LINEDOWN: // SB_LINERIGHT: + sInfo.nPos++; + break; + + case SB_PAGEUP: // SB_PAGELEFT: + sInfo.nPos -= sInfo.nPage; + break; + + case SB_PAGEDOWN: // SB_PAGERIGHT: + sInfo.nPos += sInfo.nPage; + break; + + case SB_THUMBTRACK: + sInfo.nPos = sInfo.nTrackPos; + break; + + case SB_THUMBPOSITION: + sInfo.nPos = sInfo.nTrackPos; + break; + + case SB_TOP: // SB_LEFT: + sInfo.nPos = sInfo.nMin; + break; + + case SB_BOTTOM: // SB_RIGHT: + sInfo.nPos = sInfo.nMax; + break; + + default: + break; + } + + sInfo.nPos = min(max(sInfo.nPos, 0), Maximum); + + if (oldPos != sInfo.nPos) + { + POINT scOldPos = scPos; + + /* We now modify scPos */ + *pOriginXY = sInfo.nPos; + + ScrollWindowEx(hwnd, + (scOldPos.x - scPos.x), + (scOldPos.y - scPos.y), + NULL, + NULL, + NULL, + NULL, + SW_INVALIDATE | SW_ERASE | SW_SCROLLCHILDREN); + + sInfo.fMask = SIF_POS; + SetScrollInfo(hwnd, nBar, &sInfo, TRUE); + } +} + +LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + RECT rc = {0,0,5000,5000}; + switch (message) + { + case WM_DESTROY: + PostQuitMessage(0); + break; + case WM_CTLCOLORSTATIC: + return (LRESULT)hbrCtlColorStatic; + case WM_CTLCOLORBTN: + return (LRESULT)hbrCtlColorBtn; + case WM_ERASEBKGND: + FillRect((HDC)wParam, &rc, hbrErase); + return TRUE; + case WM_PRINTCLIENT: + FillRect((HDC)wParam, &rc, hbrPrintClientClear); + break; + case WM_HSCROLL: + OnScroll(hWnd, SB_HORZ, LOWORD(wParam)); + break; + case WM_VSCROLL: + OnScroll(hWnd, SB_VERT, LOWORD(wParam)); + break; + case WM_DRAWITEM : + { + DRAWITEMSTRUCT* di = (DRAWITEMSTRUCT*)lParam; + INT oldBkMode; + INT state = (di->itemState == ODS_SELECTED) ? DFCS_BUTTONPUSH|DFCS_PUSHED : DFCS_BUTTONPUSH; + DrawFrameControl( di->hDC, &di->rcItem, DFC_BUTTON, state ); + oldBkMode = SetBkMode(di->hDC, TRANSPARENT); + DrawTextW(di->hDC, L"Ownder drawn text", -1, &di->rcItem, DT_VCENTER | DT_CENTER); + SetBkMode(di->hDC, oldBkMode); + break; + } + case WM_NOTIFY: + { + NMHDR* phdr = (NMHDR*)lParam; + if (phdr->code == NM_CUSTOMDRAW) + { + LPNMCUSTOMDRAW lpNMCustomDraw = (LPNMCUSTOMDRAW) lParam; + if (lpNMCustomDraw->dwDrawStage == CDDS_PREERASE && bSkipErase) + return CDRF_SKIPDEFAULT; + else if (lpNMCustomDraw->dwDrawStage == CDDS_PREPAINT && bSkipPaint) + return CDRF_SKIPDEFAULT; + return CDRF_DODEFAULT; + } + } + case WM_COMMAND: + { + UINT id = LOWORD(wParam); + switch(id) + { + case IDM_NULL_WIN: hbrErase = hbrNULL; break; + case IDM_RED_WIN: hbrErase = hbrRed; break; + case IDM_GREEN_WIN: hbrErase = hbrGreen; break; + case IDM_BLUE_WIN: hbrErase = hbrBlue; break; + case IDM_YELLOW_WIN: hbrErase = hbrYellow; break; + case IDM_CYAN_WIN: hbrErase = hbrCyan; break; + + case IDM_NULL_STATIC: hbrCtlColorStatic = hbrNULL; break; + case IDM_RED_STATIC: hbrCtlColorStatic = hbrRed; break; + case IDM_GREEN_STATIC: hbrCtlColorStatic = hbrGreen; break; + case IDM_BLUE_STATIC: hbrCtlColorStatic = hbrBlue; break; + case IDM_YELLOW_STATIC: hbrCtlColorStatic = hbrYellow; break; + case IDM_CYAN_STATIC: hbrCtlColorStatic = hbrCyan; break; + + case IDM_NULL_BTN: hbrCtlColorBtn = hbrNULL; break; + case IDM_RED_BTN: hbrCtlColorBtn = hbrRed; break; + case IDM_GREEN_BTN: hbrCtlColorBtn = hbrGreen; break; + case IDM_BLUE_BTN: hbrCtlColorBtn = hbrBlue; break; + case IDM_YELLOW_BTN: hbrCtlColorBtn = hbrYellow; break; + case IDM_CYAN_BTN: hbrCtlColorBtn = hbrCyan; break; + + case IDM_NULL_PRINTCLNT: hbrPrintClientClear = hbrNULL; break; + case IDM_RED_PRINTCLNT: hbrPrintClientClear = hbrRed; break; + case IDM_GREEN_PRINTCLNT: hbrPrintClientClear = hbrGreen; break; + case IDM_BLUE_PRINTCLNT: hbrPrintClientClear = hbrBlue; break; + case IDM_YELLOW_PRINTCLNT: hbrPrintClientClear = hbrYellow; break; + case IDM_CYAN_PRINTCLNT: hbrPrintClientClear = hbrCyan; break; + + case IDM_SKIP_ERASE: bSkipErase = !bSkipErase; break; + case IDM_SKIP_PAINT: bSkipPaint = !bSkipPaint; break; + default: + return 0; + } + + InvalidateRect(hWnd, NULL, TRUE); + break; + } + default: + return DefWindowProc(hWnd, message, wParam, lParam); + } + return 0; +} diff --git a/modules/rostests/win32/comctl32/buttonvistest/buttonvistest.rc b/modules/rostests/win32/comctl32/buttonvistest/buttonvistest.rc new file mode 100644 index 00000000000..f9f80767956 --- /dev/null +++ b/modules/rostests/win32/comctl32/buttonvistest/buttonvistest.rc @@ -0,0 +1,65 @@ +#include +#include + +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +IDI_WIN32PROJECT1 ICON "Win32Project1.ico" +IDI_SMALL ICON "small.ico" + +500 RT_MANIFEST "comctl6.manifest" + +STRINGTABLE +BEGIN + IDS_APP_TITLE "Win32Project1" + IDC_WIN32PROJECT1 "WIN32PROJECT1" +END + +IDB_BITMAP1 BITMAP "143.bmp" +IDB_BITMAP2 BITMAP "225.bmp" + +IDC_MENU MENU +BEGIN + POPUP "Colours" + BEGIN + POPUP "Window brush" + BEGIN + MENUITEM "NULL_BRUSH", IDM_NULL_WIN + MENUITEM "Red", IDM_RED_WIN + MENUITEM "Green", IDM_GREEN_WIN + MENUITEM "Blue", IDM_BLUE_WIN + MENUITEM "Yellow", IDM_YELLOW_WIN + MENUITEM "Cyan", IDM_CYAN_WIN + END + POPUP "CTLCOLORSTATIC" + BEGIN + MENUITEM "NULL_BRUSH", IDM_NULL_STATIC + MENUITEM "Red", IDM_RED_STATIC + MENUITEM "Green", IDM_GREEN_STATIC + MENUITEM "Blue", IDM_BLUE_STATIC + MENUITEM "Yellow", IDM_YELLOW_STATIC + MENUITEM "Cyan", IDM_CYAN_STATIC + END + POPUP "CTLCOLORBTN" + BEGIN + MENUITEM "NULL_BRUSH", IDM_NULL_BTN + MENUITEM "Red", IDM_RED_BTN + MENUITEM "Green", IDM_GREEN_BTN + MENUITEM "Blue", IDM_BLUE_BTN + MENUITEM "Yellow", IDM_YELLOW_BTN + MENUITEM "Cyan", IDM_CYAN_BTN + END + POPUP "PRINTCLIENT clear" + BEGIN + MENUITEM "NULL_BRUSH", IDM_NULL_PRINTCLNT + MENUITEM "Red", IDM_RED_PRINTCLNT + MENUITEM "Green", IDM_GREEN_PRINTCLNT + MENUITEM "Blue", IDM_BLUE_PRINTCLNT + MENUITEM "Yellow", IDM_YELLOW_PRINTCLNT + MENUITEM "Cyan", IDM_CYAN_PRINTCLNT + END + END + POPUP "Skip" + BEGIN + MENUITEM "Skip erase", IDM_SKIP_ERASE + MENUITEM "Skip paint", IDM_SKIP_PAINT + END +END \ No newline at end of file diff --git a/modules/rostests/win32/comctl32/buttonvistest/comctl6.manifest b/modules/rostests/win32/comctl32/buttonvistest/comctl6.manifest new file mode 100644 index 00000000000..be8743f7276 --- /dev/null +++ b/modules/rostests/win32/comctl32/buttonvistest/comctl6.manifest @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + diff --git a/modules/rostests/win32/comctl32/buttonvistest/resource.h b/modules/rostests/win32/comctl32/buttonvistest/resource.h new file mode 100644 index 00000000000..1b271d0a60d --- /dev/null +++ b/modules/rostests/win32/comctl32/buttonvistest/resource.h @@ -0,0 +1,38 @@ +#define IDI_WIN32PROJECT1 107 +#define IDI_SMALL 108 +#define IDS_APP_TITLE 103 +#define IDC_WIN32PROJECT1 109 +#define IDB_BITMAP1 130 +#define IDB_BITMAP2 131 +#define IDC_MENU 140 + +#define IDM_NULL_WIN 200 +#define IDM_RED_WIN 201 +#define IDM_GREEN_WIN 202 +#define IDM_BLUE_WIN 203 +#define IDM_YELLOW_WIN 204 +#define IDM_CYAN_WIN 205 + +#define IDM_NULL_STATIC 206 +#define IDM_RED_STATIC 207 +#define IDM_GREEN_STATIC 208 +#define IDM_BLUE_STATIC 209 +#define IDM_YELLOW_STATIC 210 +#define IDM_CYAN_STATIC 211 + +#define IDM_NULL_BTN 212 +#define IDM_RED_BTN 213 +#define IDM_GREEN_BTN 214 +#define IDM_BLUE_BTN 215 +#define IDM_YELLOW_BTN 216 +#define IDM_CYAN_BTN 217 + +#define IDM_NULL_PRINTCLNT 218 +#define IDM_RED_PRINTCLNT 219 +#define IDM_GREEN_PRINTCLNT 220 +#define IDM_BLUE_PRINTCLNT 221 +#define IDM_YELLOW_PRINTCLNT 222 +#define IDM_CYAN_PRINTCLNT 223 + +#define IDM_SKIP_ERASE 250 +#define IDM_SKIP_PAINT 251 diff --git a/modules/rostests/win32/comctl32/buttonvistest/small.ico b/modules/rostests/win32/comctl32/buttonvistest/small.ico new file mode 100644 index 0000000000000000000000000000000000000000..b3ec03bd617f32e58128fa977fd6ac9605124f4b GIT binary patch literal 46227 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