win32day10-组合框/列表框/滚动条/控件的自绘制 admin 2023-02-13 16:18:02 篇首语:本文由小编为大家整理,主要介绍了win32day10-组合框/列表框/滚动条/控件的自绘制相关的知识,希望对你有一定的参考价值。 组合框 ComboBox 1 组合框的样式 1.1 简单组合框 CBS_SIMPLE 1.2 下拉式组合框 CBS_DROPDOWN 能输入或者从下拉列表中选择 1.3 下拉列表式组合框 CBS_DROPDOWNLIST 只能从下拉列表中选择 2 组合框的使用 2.1 组合框的创建 窗口类名称是 COMBOBOX, 使用CreateWindow 创建, 创建时要注意窗口高度(弹出的列表). 2.2 增加选项 CB_ADDSTRING/CB_INSERTSTRING CB_ADDSTRING: WPARAM为0不使用, LPARAM 是添加字符串的地址 2.3 删除选项 CB_DELETESTRING 删除指定选项 CB_RESETCONTENT 清空所有选项 2.4 选择 CB_GETCURSEL 获取被选择项 CB_SETCURSEL 设置当前的选择项 CB_SELECTSTRING 设置选择指定的字符串所对应的项 2.5 查找 CB_FINDSTRING 根据指定的字符串,找到对应 项的索引 1)大小写不敏感 2)字符串和选项从左到右匹配. 3)选项包含字符串即可 2.6 获取选项或者被选择字符串 CB_GETLBTEXT 获取选项的字符串 WM_GETTEXT 获取被选择到窗口的字符串 2.7 选项的数据 可以将自定义数据信息,在选项中设置和获取. CB_SETITEMDATA 将数据保存到选项中 CB_GETITEMDATA 从选项当中获取数据 2.8 目录显示 CB_DIR 将指定路径下的文件和路径信息 显示在ComboBox当中 wParam - 显示的类型 lParam - 路径字符串地址 2.9 通知消息 通过WM_COMMAND消息,通知父窗口. CBN_SELCHANGE 当窗口的选项发生变化的 情况下,通知父窗口. // WinComboBox.cpp : Defines the entry point for the application.//#include "stdafx.h"#include "stdio.h"#include "resource.h"HINSTANCE g_hInst = NULL;void OnCreate( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam )//简单组合框的创建CreateWindow( "COMBOBOX", "SIMPLE",WS_CHILD|WS_VISIBLE|CBS_SIMPLE,50, 50, 120, 300, hWnd, (HMENU)1001, g_hInst, NULL );//下拉式组合框的创建CreateWindow( "COMBOBOX", "DROPDOWN",WS_CHILD|WS_VISIBLE|WS_VSCROLL|CBS_DROPDOWN,200, 50, 120, 300, hWnd,(HMENU)1002, g_hInst, NULL );//下拉列表式组合框的创建CreateWindow( "COMBOBOX", "DROPDOWNLIST",WS_CHILD|WS_VISIBLE|WS_VSCROLL|CBS_DROPDOWNLIST,350, 50, 120, 100, hWnd,(HMENU)1003, g_hInst, NULL );void OnAdd( HWND hWnd )//获取COMBOBOX窗口句柄HWND hSimple = GetDlgItem( hWnd, 1001 );HWND hDropDown = GetDlgItem( hWnd, 1002 );HWND hDropList = GetDlgItem( hWnd, 1003 );//添加多个选项CHAR szText[] = "ComboBox 0";for( int nIndex=0; nIndex<10; nIndex++ )//添加选项LRESULT nItem = SendMessage( hSimple, CB_ADDSTRING, 0, (LPARAM)szText );//设置项的数据SendMessage( hSimple, CB_SETITEMDATA,nItem, 100+nIndex );SendMessage( hDropDown, CB_ADDSTRING, 0, (LPARAM)szText );SendMessage( hDropList, CB_ADDSTRING, 0, (LPARAM)szText );//改变选项内容szText[9]++;void OnDel( HWND hWnd )//获取COMBOBOX窗口句柄HWND hSimple = GetDlgItem( hWnd, 1001 );HWND hDropDown = GetDlgItem( hWnd, 1002 );HWND hDropList = GetDlgItem( hWnd, 1003 );//删除指定项SendMessage( hSimple, CB_DELETESTRING, 5, 0 );SendMessage( hDropDown, CB_DELETESTRING, 5, 0 );SendMessage( hDropList, CB_DELETESTRING, 5, 0 );void OnReset( HWND hWnd )//获取COMBOBOX窗口句柄HWND hSimple = GetDlgItem( hWnd, 1001 );HWND hDropDown = GetDlgItem( hWnd, 1002 );HWND hDropList = GetDlgItem( hWnd, 1003 );//清空所有项SendMessage( hSimple, CB_RESETCONTENT, 0, 0 );SendMessage( hDropDown, CB_RESETCONTENT, 0, 0 );SendMessage( hDropList, CB_RESETCONTENT, 0, 0 );void OnSelect( HWND hWnd )//获取COMBOBOX窗口句柄HWND hSimple = GetDlgItem( hWnd, 1001 );HWND hDropDown = GetDlgItem( hWnd, 1002 );HWND hDropList = GetDlgItem( hWnd, 1003 );//获取和设置选择项LRESULT nSel = SendMessage( hSimple, CB_GETCURSEL, 0, 0 );//获取数据LRESULT nValue = SendMessage( hSimple, CB_GETITEMDATA, nSel, 0 );CHAR szInfo[260] = 0 ;sprintf( szInfo, "%d", nValue );MessageBox( NULL, szInfo, "WinCombo", MB_OK );//设置选择项SendMessage( hDropDown, CB_SETCURSEL, nSel, 0 );CHAR szText[] = "ComboBox 5";SendMessage( hDropList, CB_SELECTSTRING, -1, (LPARAM)szText );void OnFind( HWND hWnd )//获取COMBOBOX窗口句柄HWND hSimple = GetDlgItem( hWnd, 1001 );HWND hDropDown = GetDlgItem( hWnd, 1002 );HWND hDropList = GetDlgItem( hWnd, 1003 );//查找字符串CHAR szText[] = "ComboBox 5";LRESULT nFind1 = SendMessage( hSimple, CB_FINDSTRING, -1, (LPARAM)szText );SendMessage( hDropDown, CB_SETCURSEL, nFind1, 0 );SendMessage( hDropList, CB_SETCURSEL, nFind1, 0 );void OnPath( HWND hWnd )//获取COMBOBOX窗口句柄HWND hSimple = GetDlgItem( hWnd, 1001 );HWND hDropDown = GetDlgItem( hWnd, 1002 );HWND hDropList = GetDlgItem( hWnd, 1003 );//显示目录CHAR szPath[MAX_PATH] = "C:\\*.*";SendMessage( hSimple, CB_DIR,DDL_DIRECTORY|DDL_ARCHIVE,(LPARAM)szPath );SendMessage( hDropDown, CB_DIR,DDL_DIRECTORY|DDL_ARCHIVE,(LPARAM)szPath );SendMessage( hDropList, CB_DIR,DDL_DIRECTORY|DDL_ARCHIVE,(LPARAM)szPath );void OnCommand( HWND hWnd, UINT nMsg,WPARAM wParam, LPARAM lParam )int nNotifyCode = HIWORD( wParam );int nEventID = LOWORD( wParam );switch( nEventID )case ID_ADD:OnAdd( hWnd );break;case ID_DEL:OnDel( hWnd );break;case ID_RESET:OnReset( hWnd );break;case ID_SEL:OnSelect( hWnd );break;case ID_FIND:OnFind( hWnd );break;case ID_PATH:OnPath( hWnd );break;case 1001:HWND hSimple = GetDlgItem( hWnd, 1001 );HWND hDropDown = GetDlgItem( hWnd, 1002 );HWND hDropList = GetDlgItem( hWnd, 1003 );LRESULT nSel = 0;switch( nNotifyCode )case CBN_SELCHANGE:nSel = SendMessage( hSimple, CB_GETCURSEL, 0, 0 );SendMessage( hDropDown, CB_SETCURSEL, nSel, 0 );SendMessage( hDropList, CB_SETCURSEL, nSel, 0 );//MessageBox( NULL, "CBN_SELCHANGE",//"WinCombo", MB_OK );break;break;LRESULT CALLBACK WndProc( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam )switch( nMsg )case WM_CREATE:OnCreate( hWnd, nMsg, wParam, lParam );break;case WM_COMMAND:OnCommand( hWnd, nMsg, wParam, lParam );break;case WM_DESTROY:PostQuitMessage( 0 );return 0;return DefWindowProc( hWnd, nMsg,wParam, lParam );BOOL RegisterWnd( LPSTR pszClassName )WNDCLASSEX wce = 0 ;wce.cbSize = sizeof( wce );wce.cbClsExtra = 0;wce.cbWndExtra = 0;wce.hbrBackground = HBRUSH(COLOR_BTNFACE+1);wce.hCursor = NULL;wce.hIcon = NULL;wce.hIconSm = NULL;wce.hInstance = g_hInst;wce.lpfnWndProc = WndProc;wce.lpszClassName = pszClassName;wce.lpszMenuName = NULL;wce.style = CS_HREDRAW|CS_VREDRAW;ATOM nAtom = RegisterClassEx( &wce );if( 0 == nAtom )return FALSE;return TRUE;HWND CreateWnd( LPSTR pszClassName )HMENU hMenu = LoadMenu( g_hInst,MAKEINTRESOURCE(IDR_MAIN) );HWND hWnd = CreateWindowEx( 0,pszClassName, "MyWnd", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, NULL, hMenu, g_hInst,NULL );return hWnd;void DisplayWnd( HWND hWnd )ShowWindow( hWnd, SW_SHOW );UpdateWindow( hWnd );void Message( )MSG msg = 0 ;while( GetMessage( &msg, NULL, 0, 0 ) )TranslateMessage( &msg );DispatchMessage( &msg );int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)g_hInst = hInstance;RegisterWnd( "MYWND" );HWND hWnd = CreateWnd( "MYWND" );DisplayWnd( hWnd );Message( );return 0; 列表框 ListBox 1 列表框的样式 1.1 单选列表框 默认 1.2 多选列表框 LBS_MULTIPLESEL 2 列表框的使用 2.1 列表框的创建 窗口类名为LISTBOX, 使用CreateWindow/Ex 2.2 增加选项 LB_ADDSTRING LB_INSERTSTRING 2.2 删除选项 LB_DELETESTRING 删除指定选项 LB_RESETCONTENT 清空所有选项 2.3 选择项的获取和设置 LB_GETCURSEL 获取被选择项 LB_SETCURSEL 设置当前被选择项 LB_GETSEL 获取指定项的选择状态 LB_SETSEL 设置指定项的选择状态 LB_GETSELCOUNT 获取被选择的数量 LB_GETSELITEMS 获取被选择项的索引 2.4 查找 LB_FINDSTRING 2.5 获取指定项的文字 LB_GETEXT 指定项的文字 LB_GETTEXTLEN 指定项的文字的长度 2.6 选项的数据 LB_SETITEMDATA 将自定义数据保存到 指定的选项当中 LB_GETITEMDATA 将自定义数据从指定 选项中取出 2.7 目录信息 LB_DIR 显示指定目录下的文件和子目录 信息 2.8 通知消息 LBN_SELCHANGE 当ListBox中的选择项发生 变化时,通知父窗口. 注意:对于ListBox需要增加LBS_NOTIFY的 样式,才能发送通知消息 // WinListBox.cpp : Defines the entry point for the application.//#include "stdafx.h"#include "resource.h"HINSTANCE g_hInst = NULL;HWND g_hSingle = NULL;HWND g_hMulti = NULL;void OnCreate( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam )g_hSingle = CreateWindow( "LISTBOX", "SINGLE", WS_CHILD|WS_VISIBLE|LBS_NOTIFY,50, 50, 200, 400, hWnd,(HMENU)1001, g_hInst, NULL );g_hMulti = CreateWindow( "LISTBOX", "MULTI", WS_CHILD|WS_VISIBLE|LBS_MULTIPLESEL|LBS_NOTIFY,300, 50, 200, 400, hWnd,(HMENU)1002, g_hInst, NULL );void OnAdd( )CHAR szText[] = "ListBox 0";for( int nIndex=0; nIndex<10; nIndex++ )//添加项LRESULT nItem = SendMessage( g_hSingle, LB_ADDSTRING,0, (LPARAM)szText );SendMessage( g_hMulti, LB_ADDSTRING,0, (LPARAM)szText );szText[8]++;void OnSelect( )//设置当前选择项SendMessage( g_hSingle, LB_SETCURSEL, 2, 0 );//设置指定项的选择状态for( int nIndex=0; nIndex<10; nIndex++ )SendMessage( g_hMulti, LB_SETSEL, TRUE, nIndex );//获取所有选择项的数量LRESULT nCount = SendMessage( g_hMulti,LB_GETSELCOUNT, 0, 0 );if( nCount == 10 )MessageBox( NULL, "10", "10", MB_OK );//获取选择项的索引号INT nSel[20] = 0 ;SendMessage( g_hMulti, LB_GETSELITEMS,20, (LPARAM)nSel );void OnCommand( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam )int nNotifyCode = HIWORD( wParam );int nCtrlID = LOWORD( wParam );switch( nCtrlID )case ID_ADD:OnAdd( );break;case ID_SELECT:OnSelect( );break;case 1001:switch( nNotifyCode )case LBN_SELCHANGE:MessageBox( NULL, "LBN_SELCHANGE","ListBox", MB_OK );break;break;LRESULT CALLBACK WndProc( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam )switch( nMsg )case WM_CREATE:OnCreate( hWnd, nMsg, wParam, lParam );break;case WM_COMMAND:OnCommand( hWnd, nMsg, wParam, lParam );break;case WM_DESTROY:PostQuitMessage( 0 );return 0;return DefWindowProc( hWnd, nMsg,wParam, lParam );BOOL RegisterWnd( LPSTR pszClassName )WNDCLASSEX wce = 0 ;wce.cbSize = sizeof( wce );wce.cbClsExtra = 0;wce.cbWndExtra = 0;wce.hbrBackground = HBRUSH(COLOR_BTNFACE+1);wce.hCursor = NULL;wce.hIcon = NULL;wce.hIconSm = NULL;wce.hInstance = g_hInst;wce.lpfnWndProc = WndProc;wce.lpszClassName = pszClassName;wce.lpszMenuName = NULL;wce.style = CS_HREDRAW|CS_VREDRAW;ATOM nAtom = RegisterClassEx( &wce );if( 0 == nAtom )return FALSE;return TRUE;HWND CreateWnd( LPSTR pszClassName )HMENU hMenu = LoadMenu( g_hInst, MAKEINTRESOURCE(IDR_MAIN) );HWND hWnd = CreateWindowEx( 0,pszClassName, "MyWnd", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, NULL, hMenu, g_hInst,NULL );return hWnd;void DisplayWnd( HWND hWnd )ShowWindow( hWnd, SW_SHOW );UpdateWindow( hWnd );void Message( )MSG msg = 0 ;while( GetMessage( &msg, NULL, 0, 0 ) )TranslateMessage( &msg );DispatchMessage( &msg );int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)g_hInst = hInstance;RegisterWnd( "MYWND" );HWND hWnd = CreateWnd( "MYWND" );DisplayWnd( hWnd );Message( );return 0; 滚动条 1 滚动条样式 1.1 水平滚动条 SBS_HORZ 1.2 垂直滚动条 SBS_VERT 2 滚动条的使用 2.1 滚动条的创建 窗口类名称 SCROLLBAR 2.2 消息处理 2.2.1 水平滚动条 WM_HSCROLL LOWORD(wParam) - 滚动的标示 HIWORD(wParam) - 当前滑块的位置 lParam - 窗口的句柄 2.2.2 垂直滚动条 WM_VSCROLL LOWORD(wParam) - 滚动的标示 HIWORD(wParam) - 当前滑块的位置 lParam - 窗口的句柄 2.2.3 HIWORD(wParam)只在 SB_THUMBPOSITION/SB_THUMBTRACK时 有效. 2.3 滚动条的滚动范围 SBM_SETRANGE 设置滚动条的滚动范围 wParam - 最小值,起始值 lParam - 最大值,终止值 SBM_GETRANGE 获取滚动条的滚动范围 wParam - 最小值得存放的INT的地址 lParam - 最大值得存放的INT的地址 2.4 滑块位置的设置和获取 SBM_SETPOS 设置滑块位置 wParam - 新的滑块位置 lParam - 重新绘制窗口 SBM_GETPOS 获取,返回当前位置 // WinScrollBar.cpp : Defines the entry point for the application.//#include "stdafx.h"HINSTANCE g_hInst = NULL;HWND g_hHorz = NULL;HWND g_hVert = NULL;void OnCreate( HWND hWnd, WPARAM wParam,LPARAM lParam )//创建滚动条g_hHorz = CreateWindow( "SCROLLBAR", "HORZ",WS_CHILD|WS_VISIBLE|SBS_HORZ,0, 300, 300, 30, hWnd,(HMENU)1001, g_hInst, NULL );g_hVert = CreateWindow( "SCROLLBAR", "VERT",WS_CHILD|WS_VISIBLE|SBS_VERT,300, 0, 30, 300, hWnd,(HMENU)1002, g_hInst, NULL );//设置滚动范围SendMessage( g_hHorz, SBM_SETRANGE, 0, 300 );SendMessage( g_hVert, SBM_SETRANGE, 0, 300 );void OnHScroll( HWND hWnd, WPARAM wParam,LPARAM lParam )int nScrollCode = LOWORD( wParam );int nPos = HIWORD( wParam ); switch( nScrollCode )case SB_LINELEFT: //左边箭头nPos = SendMessage( g_hHorz, SBM_GETPOS,0, 0 );nPos--;SendMessage( g_hHorz, SBM_SETPOS, nPos, TRUE );break;case SB_LINERIGHT: //右边箭头nPos = SendMessage( g_hHorz, SBM_GETPOS,0, 0 );nPos++;SendMessage( g_hHorz, SBM_SETPOS, nPos, TRUE );break;case SB_PAGELEFT: //滑块左边的空白区域nPos = SendMessage( g_hHorz, SBM_GETPOS,0, 0 );nPos -= 10;SendMessage( g_hHorz, SBM_SETPOS, nPos, TRUE );break;case SB_PAGERIGHT://滑块右边的空白区域nPos = SendMessage( g_hHorz, SBM_GETPOS,0, 0 );nPos += 10;SendMessage( g_hHorz, SBM_SETPOS, nPos, TRUE );break;case SB_THUMBPOSITION://拖拽滑块后SendMessage( g_hHorz, SBM_SETPOS,nPos, TRUE );break;InvalidateRect( hWnd, NULL, TRUE );void OnVScroll( HWND hWnd, WPARAM wParam,LPARAM lParam )int nScrollCode = LOWORD( wParam );int nPos = HIWORD( wParam ); switch( nScrollCode )case SB_LINEUP: //上边箭头nPos = SendMessage( g_hVert, SBM_GETPOS,0, 0 );nPos--;SendMessage( g_hVert, SBM_SETPOS, nPos, TRUE );break;case SB_LINEDOWN://下边箭头nPos = SendMessage( g_hVert, SBM_GETPOS,0, 0 );nPos++;SendMessage( g_hVert, SBM_SETPOS, nPos, TRUE );break;case SB_PAGEUP://滑块上边的空白区域nPos = SendMessage( g_hVert, SBM_GETPOS,0, 0 );nPos -= 10;SendMessage( g_hVert, SBM_SETPOS, nPos, TRUE );break;case SB_PAGEDOWN://滑块下边的空白区域nPos = SendMessage( g_hVert, SBM_GETPOS,0, 0 );nPos += 10;SendMessage( g_hVert, SBM_SETPOS, nPos, TRUE );break;case SB_THUMBPOSITION://拖拽滑块后SendMessage( g_hVert, SBM_SETPOS,nPos, TRUE );break;InvalidateRect( hWnd, NULL, TRUE );void OnPaint( HWND hWnd, WPARAM wParam,LPARAM lParam )PAINTSTRUCT ps = 0 ;HDC hDC = BeginPaint( hWnd, &ps );int nVert = SendMessage( g_hVert, SBM_GETPOS, 0, 0 );int nHorz = SendMessage( g_hHorz, SBM_GETPOS, 0, 0 );CHAR szText[] = "Hello ScroolBar";TextOut( hDC, 150 - nHorz, 150 - nVert, szText, strlen(szText) );EndPaint( hWnd, &ps );LRESULT CALLBACK WndProc( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam )switch( nMsg )case WM_PAINT:OnPaint( hWnd, wParam, lParam );break;case WM_CREATE:OnCreate( hWnd, wParam, lParam );break;case WM_HSCROLL:OnHScroll( hWnd, wParam, lParam );break;case WM_VSCROLL:OnVScroll( hWnd, wParam, lParam );break;case WM_DESTROY:PostQuitMessage( 0 );return 0;return DefWindowProc( hWnd, nMsg,wParam, lParam );BOOL RegisterWnd( LPSTR pszClassName )WNDCLASSEX wce = 0 ;wce.cbSize = sizeof( wce );wce.cbClsExtra = 0;wce.cbWndExtra = 0;wce.hbrBackground = HBRUSH(COLOR_WINDOW);wce.hCursor = NULL;wce.hIcon = NULL;wce.hIconSm = NULL;wce.hInstance = g_hInst;wce.lpfnWndProc = WndProc;wce.lpszClassName = pszClassName;wce.lpszMenuName = NULL;wce.style = CS_HREDRAW|CS_VREDRAW;ATOM nAtom = RegisterClassEx( &wce );if( 0 == nAtom )return FALSE;return TRUE;HWND CreateWnd( LPSTR pszClassName )HWND hWnd = CreateWindowEx( 0,pszClassName, "MyWnd", WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN|WS_HSCROLL|WS_VSCROLL,CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, NULL, NULL, g_hInst,NULL );return hWnd;void DisplayWnd( HWND hWnd )ShowWindow( hWnd, SW_SHOW );UpdateWindow( hWnd );void Message( )MSG msg = 0 ;while( GetMessage( &msg, NULL, 0, 0 ) )TranslateMessage( &msg );DispatchMessage( &msg );int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)g_hInst = hInstance;RegisterWnd( "MYWND" );HWND hWnd = CreateWnd( "MYWND" );DisplayWnd( hWnd );Message( );return 0; 控件的自绘制 1 控件具有OWNERDRAW样式 BUTTON LISTBOX COMBOBOX 2 WM_MEASUREITEM 计算控件的大小 (UINT) wParam - 控件ID (LPMEASUREITEMSTRUCT)lParam-控件项的大小 3 WM_DRAWITEM 实现控件的绘制 (UINT) wParam - 控件ID (LPDRAWITEMSTRUCT)lParam - 控件绘制的信息 // WinOwnerDraw.cpp : Defines the entry point for the application.//#include "stdafx.h"HINSTANCE g_hInst = NULL;void OnCreate( HWND hWnd, WPARAM wParam, LPARAM lParam )CreateWindow( "BUTTON", "MyButton",WS_CHILD|WS_VISIBLE|BS_OWNERDRAW,50, 50, 200, 50, hWnd,(HMENU)1001, g_hInst, NULL );void OnDrawItem( HWND hWnd, WPARAM wParam, LPARAM lParam )LPDRAWITEMSTRUCT pDis = ( LPDRAWITEMSTRUCT )lParam;if( ODT_BUTTON == pDis->CtlType )//绘制按钮if( pDis->itemState & ODS_SELECTED )HBRUSH hBrush = CreateSolidBrush( RGB(200, 200, 255 ) );HBRUSH hOldBrush = (HBRUSH)SelectObject( pDis->hDC, hBrush );RoundRect( pDis->hDC, pDis->rcItem.left, pDis->rcItem.top, pDis->rcItem.right, pDis->rcItem.bottom, 15, 15 );SelectObject( pDis->hDC, hOldBrush );DeleteObject( hBrush );elseHBRUSH hBrush = CreateSolidBrush( RGB(100, 100, 255 ) );HBRUSH hOldBrush = (HBRUSH)SelectObject( pDis->hDC, hBrush );RoundRect( pDis->hDC, pDis->rcItem.left, pDis->rcItem.top, pDis->rcItem.right, pDis->rcItem.bottom, 15, 15 );SelectObject( pDis->hDC, hOldBrush );DeleteObject( hBrush );//绘制按钮文字CHAR szName[260] = 0 ;GetWindowText( pDis->hwndItem, szName, 260 );int nOldMode = SetBkMode( pDis->hDC, TRANSPARENT );DrawText( pDis->hDC, szName, strlen(szName),&pDis->rcItem, DT_CENTER|DT_VCENTER|DT_SINGLELINE );SetBkMode( pDis->hDC, nOldMode );void OnMeasureItem( HWND hWnd, WPARAM wParam, LPARAM lParam )LPMEASUREITEMSTRUCT pMis = (LPMEASUREITEMSTRUCT)lParam;pMis->itemHeight = 200;LRESULT CALLBACK WndProc( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam )switch( nMsg )case WM_CREATE:OnCreate( hWnd, wParam, lParam );break;case WM_DRAWITEM:OnDrawItem( hWnd, wParam, lParam );return 0;case WM_MEASUREITEM:OnMeasureItem( hWnd, wParam, lParam );return 0;case WM_DESTROY:PostQuitMessage( 0 );return 0;return DefWindowProc( hWnd, nMsg,wParam, lParam );BOOL RegisterWnd( LPSTR pszClassName )WNDCLASSEX wce = 0 ;wce.cbSize = sizeof( wce );wce.cbClsExtra = 0;wce.cbWndExtra = 0;wce.hbrBackground = HBRUSH(COLOR_WINDOW);wce.hCursor = NULL;wce.hIcon = NULL;wce.hIconSm = NULL;wce.hInstance = g_hInst;wce.lpfnWndProc = WndProc;wce.lpszClassName = pszClassName;wce.lpszMenuName = NULL;wce.style = CS_HREDRAW|CS_VREDRAW;ATOM nAtom = RegisterClassEx( &wce );if( 0 == nAtom )return FALSE;return TRUE;HWND CreateWnd( LPSTR pszClassName )HWND hWnd = CreateWindowEx( 0,pszClassName, "MyWnd", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, NULL, NULL, g_hInst,NULL );return hWnd;void DisplayWnd( HWND hWnd )ShowWindow( hWnd, SW_SHOW );UpdateWindow( hWnd );void Message( )MSG msg = 0 ;while( GetMessage( &msg, NULL, 0, 0 ) )TranslateMessage( &msg );DispatchMessage( &msg );int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)g_hInst = hInstance;RegisterWnd( "MYWND" );HWND hWnd = CreateWnd( "MYWND" );DisplayWnd( hWnd );Message( );return 0; 以上是关于win32day10-组合框/列表框/滚动条/控件的自绘制的主要内容,如果未能解决你的问题,请参考以下文章 云原生使用Dockerfile制作openGauss镜像 Android 12 init 子进程回收与服务重启分析 您可能还会对下面的文章感兴趣: 相关文章 浏览器打不开网址提示“ERR_CONNECTION_TIMED_OUT”错误代码的解决方法 如何安装ocx控件 VMware的虚拟机为啥ip地址老是自动变化 vbyone和EDP区别 linux/debian到底怎么重启和关机 苹果平板键盘被弄到上方去了,如何调回正常? 机器学习常用距离度量 如何查看kindle型号