【win32】day10-组合框/列表框/滚动条/控件的自绘制

原创 2016年09月23日 22:41:04

组合框 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: WPARAM0不使用, 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 );
		}
		else
		{
			HBRUSH 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;
}






版权声明:本博客所有文章均为原创,欢迎交流,欢迎转载;转载请勿篡改内容,并且注明出处,谢谢!

win32之列表框

列表框:    1.风格      单列列表框    单例列表框 - 默认 多列列表框 - LBS_MULTICOLUMN 多列列表框    2. 使用      创建列表框 "LIST...
  • u014660247
  • u014660247
  • 2016年10月19日 18:08
  • 647

出现问题的自绘组合框

  • 2014年05月28日 20:42
  • 26KB
  • 下载

【PB】使用 Win32 API 扩展下拉列表框

获取/设置当前选项 要获取/设置下拉列表框的当前选项,通常是通过如下代码实现的:ddlb_example.FindItem(ddlb_example.Text, 0)ddlb_example.Sele...
  • keyssoft
  • keyssoft
  • 2007年01月17日 02:15
  • 2356

Win32学习笔记 - Windows 常用消息大全

表A-1  Windows消息分布 消息范围 说 明 0 ~ WM_USER – 1 系统消息 WM_...
  • u011471873
  • u011471873
  • 2016年03月07日 20:36
  • 1258

Windows编程基础 第十章 组合框 列表框 滚动条 自绘制控件

//本程序用来演示ComboBox #include "windows14.h" #include "stdafx.h" #include "resource.h" #include "stdio.h...
  • yangxuefeng09
  • yangxuefeng09
  • 2014年09月06日 21:02
  • 1477

win32之组合框

组和框的创建 CreateWindowEx(0, L"COMBOBOX", L"Simple", WS_VISIBLE | WS_CHILD | CBS_SIMPLE, 50, 50, 100, 2...
  • u014660247
  • u014660247
  • 2016年10月19日 18:07
  • 214

《Windows程序设计》之列表框控件

这部分代码是书中HEAD的部分,里面的东西值得细细去理会 LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM l...
  • l0g1n
  • l0g1n
  • 2012年05月02日 12:35
  • 1040

Win32 API 函数列表

ID编号 函数名 函数说明 详细说明 Win16支持 Win9x支持 WinNT支持1 AbortDoc 终止一项打印作业  Yes Yes Yes2 AbortPath 终止或取消DC中的一切路径 ...
  • confei
  • confei
  • 2007年07月13日 14:42
  • 1539

win32通用控件TreeView滚动条自绘

《标题》win32通用控件TreeView滚动条自绘      直接使用windows sdk 进行开发自绘滚动条是很让人蛋疼的,嫌消息HOOK 麻烦,又不了解第三方控件,别担心,你还有一条小路可...
  • funte
  • funte
  • 2014年04月22日 15:46
  • 2749

Win32程序中使用 Combo box控件

SendMessage函数向窗口发送消息 LRESULT SendMessage(   HWND hWnd,     // handle to destination window ...
  • keebai
  • keebai
  • 2014年11月26日 21:02
  • 772
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【win32】day10-组合框/列表框/滚动条/控件的自绘制
举报原因:
原因补充:

(最多只允许输入30个字)