win32-combobox

doc

// 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;
}