Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu kılavuz, basit bir kombinasyon kutusu oluşturma, öğe ekleme ve öğeleri geri alma işlemlerinin nasıl yapılacağını açıklar. Özellikle, eşlik eden kod örnekleri aşağıdaki işlevlerin nasıl gerçekleştirileceklerini gösterir:
- Üst pencerede dinamik olarak basit bir birleşik giriş kutusu oluşturun.
- Birleşik giriş kutusuna öğe listesi ekleyin ve birleşik giriş kutusunun seçim alanında ilk öğeyi görüntüleyin.
- Kullanıcının birleşik giriş kutusundan bir öğeyi ne zaman seçtiğini algılayın.
- Birleşik giriş kutusundan seçili öğeyi alın.
Bilmeniz gerekenler
Teknolojileri
Önkoşullar
- C/C++
- Windows Kullanıcı Arayüzü Programlama
Yönergeler
1. Adım: Birleşik giriş kutusunun bir örneğini oluşturma
Örnek uygulama, uygulama penceresinin alt penceresini oluşturmak için CreateWindow işlevini çağırır. WC_COMBOBOX pencere stili, bunun bir birleşik giriş kutusu olduğunu belirtir.
// Create the Combobox
//
// Uses the CreateWindow function to create a child window of
// the application window. The WC_COMBOBOX window style specifies
// that it is a combobox.
int xpos = 100; // Horizontal position of the window.
int ypos = 100; // Vertical position of the window.
int nwidth = 200; // Width of the window
int nheight = 200; // Height of the window
HWND hwndParent = m_hwnd; // Handle to the parent window
HWND hWndComboBox = CreateWindow(WC_COMBOBOX, TEXT(""),
CBS_DROPDOWN | CBS_HASSTRINGS | WS_CHILD | WS_OVERLAPPED | WS_VISIBLE,
xpos, ypos, nwidth, nheight, hwndParent, NULL, HINST_THISCOMPONENT,
NULL);
2. Adım: Öğe listesiyle birleşik giriş kutusunu yükleme
Uygulama listedeki her öğe için bir CB_ADDSTRING iletisi gönderir. Liste yüklendikten sonra uygulama, birleşik giriş kutusu seçim alanında ilk öğeyi görüntülemek için CB_SETCURSEL iletisini gönderir.
// load the combobox with item list.
// Send a CB_ADDSTRING message to load each item
TCHAR Planets[9][10] =
{
TEXT("Mercury"), TEXT("Venus"), TEXT("Terra"), TEXT("Mars"),
TEXT("Jupiter"), TEXT("Saturn"), TEXT("Uranus"), TEXT("Neptune"),
TEXT("Pluto??")
};
TCHAR A[16];
int k = 0;
memset(&A,0,sizeof(A));
for (k = 0; k <= 8; k += 1)
{
wcscpy_s(A, sizeof(A)/sizeof(TCHAR), (TCHAR*)Planets[k]);
// Add string to combobox.
SendMessage(hWndComboBox,(UINT) CB_ADDSTRING,(WPARAM) 0,(LPARAM) A);
}
// Send the CB_SETCURSEL message to display an initial item
// in the selection field
SendMessage(hWndComboBox, CB_SETCURSEL, (WPARAM)2, (LPARAM)0);
3. Adım: Kullanıcının bir öğeyi ne zaman seçtiğini algılama ve birleşik giriş kutusundan alma
Kullanıcı listeden seçim yaptığında, birleşik giriş kutusu WM_COMMAND iletisi aracılığıyla üst pencereye bir CBN_SELCHANGE bildirimi gönderir. Uygulama, bildirim iletisinin lParam alanından birleşik giriş kutusuna tanıtıcıyı alır ve seçili liste öğesinin dizinini almak için birleşik giriş kutusuna bir CB_GETCURSEL iletisi gönderir. Öğe dizinini aldıktan sonra uygulama, öğeyi almak için bir CB_GETLBTEXT iletisi gönderir. Ardından öğeyi bir ileti kutusunda görüntüler.
Uyarı
CBN_SELCHANGE bildirimi, öğe birleşik giriş kutusu seçim alanına yerleştirilmeden önce gönderilir ve işlenir. Sonuç olarak, bu örnekte, seçili öğe, ileti kutusu kapatılana kadar seçim alanında görünmez.
switch (message)
{
case WM_COMMAND:
if(HIWORD(wParam) == CBN_SELCHANGE)
// If the user makes a selection from the list:
// Send CB_GETCURSEL message to get the index of the selected list item.
// Send CB_GETLBTEXT message to get the item.
// Display the item in a messagebox.
{
int ItemIndex = SendMessage((HWND) lParam, (UINT) CB_GETCURSEL,
(WPARAM) 0, (LPARAM) 0);
TCHAR ListItem[256];
(TCHAR) SendMessage((HWND) lParam, (UINT) CB_GETLBTEXT,
(WPARAM) ItemIndex, (LPARAM) ListItem);
MessageBox(hwnd, (LPCWSTR) ListItem, TEXT("Item Selected"), MB_OK);
}
wasHandled = true;
result = 0;
break;
Tam örnek
Bu örneği oluşturmak ve çalıştırmak için Visual Studio'da yeni bir C++ Windows Boş Projesine yapıştırın (şablonu bulmanıza yardımcı olması için arama kutusuna "Boş Proje" yazın). Projeyi DemoAppolarak adlandırın.
Proje oluşturulduktan sonra Project > DemoApp Özellikleri'ni açın ve Bağlayıcı > Sistemi > Alt Sistemi'ni olarak Windows (/SUBSYSTEM:WINDOWS)ayarlayın.
Projede adlı yeni bir üst bilgi dosyası ve adlı SimpleComboBox.hSimpleComboBox.cppyeni bir kaynak dosyası oluşturun.
Bu kodu dosyaya yapıştırın SimpleComboBox.h .
// SimpleComboBox.h
// Windows Header Files:
#include <windows.h>
#include <CommCtrl.h>
// C RunTime Header Files
#include <math.h>
#include <objbase.h>
/******************************************************************
* *
* Macros *
* *
******************************************************************/
template<class Interface>
inline void
SafeRelease(
Interface **ppInterfaceToRelease
)
{
if (*ppInterfaceToRelease != NULL)
{
(*ppInterfaceToRelease)->Release();
(*ppInterfaceToRelease) = NULL;
}
}
#ifndef Assert
#if defined( DEBUG ) || defined( _DEBUG )
#define Assert(b) if (!(b)) {OutputDebugStringA("Assert: " #b "\n");}
#else
#define Assert(b)
#endif //DEBUG || _DEBUG
#endif
#ifndef HINST_THISCOMPONENT
EXTERN_C IMAGE_DOS_HEADER __ImageBase;
#define HINST_THISCOMPONENT ((HINSTANCE)&__ImageBase)
#endif
/******************************************************************
* *
* DemoApp *
* *
******************************************************************/
class DemoApp
{
public:
DemoApp();
~DemoApp();
HRESULT Initialize();
void RunMessageLoop();
private:
HRESULT CreateResources();
void DiscardResources();
static LRESULT CALLBACK WndProc(
HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam
);
private:
HWND m_hwnd;
};
Bu kodu dosyaya yapıştırın SimpleComboBox.cpp .
// SimpleComboBox.cpp
#include "SimpleComboBox.h"
/******************************************************************
* *
* The application entry point. *
* *
******************************************************************/
int WINAPI WinMain(
HINSTANCE /* hInstance */,
HINSTANCE /* hPrevInstance */,
LPSTR /* lpCmdLine */,
int /* nCmdShow */
)
{
// Ignore the return value because we want to run the program even in the
// unlikely event that HeapSetInformation fails.
HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0);
if (SUCCEEDED(CoInitialize(NULL)))
{
{
DemoApp app;
if (SUCCEEDED(app.Initialize()))
{
app.RunMessageLoop();
}
}
CoUninitialize();
}
return 0;
}
/******************************************************************
* *
* DemoApp::DemoApp constructor *
* *
* Initialize member data. *
* *
******************************************************************/
DemoApp::DemoApp() :
m_hwnd(NULL)
{
}
/******************************************************************
* *
* Release resources. *
* *
******************************************************************/
DemoApp::~DemoApp()
{
// TODO: Release app resource here.
}
/*******************************************************************
* *
* Create the application window and the combobox. *
* *
*******************************************************************/
HRESULT DemoApp::Initialize()
{
HRESULT hr;
// Register the window class.
WNDCLASSEX wcex = { sizeof(WNDCLASSEX) };
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = DemoApp::WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = sizeof(LONG_PTR);
wcex.hInstance = HINST_THISCOMPONENT;
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.lpszClassName = TEXT("DemoApp");
RegisterClassEx(&wcex);
// Create the application window.
//
// Because the CreateWindow function takes its size in pixels, we
// obtain the system DPI and use it to scale the window size.
int dpiX = 0;
int dpiY = 0;
HDC hdc = GetDC(NULL);
if (hdc)
{
dpiX = GetDeviceCaps(hdc, LOGPIXELSX);
dpiY = GetDeviceCaps(hdc, LOGPIXELSY);
ReleaseDC(NULL, hdc);
}
m_hwnd = CreateWindow(
TEXT("DemoApp"),
TEXT("Simple Combo Box Example"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
static_cast<UINT>(ceil(640.f * dpiX / 96.f)),
static_cast<UINT>(ceil(480.f * dpiY / 96.f)),
NULL,
NULL,
HINST_THISCOMPONENT,
this
);
hr = m_hwnd ? S_OK : E_FAIL;
if (SUCCEEDED(hr))
{
ShowWindow(m_hwnd, SW_SHOWNORMAL);
UpdateWindow(m_hwnd);
}
// Create the Combobox
//
// Uses the CreateWindow function to create a child window of
// the application window. The WC_COMBOBOX window style specifies
// that it is a combobox.
int xpos = 100; // Horizontal position of the window.
int ypos = 100; // Vertical position of the window.
int nwidth = 200; // Width of the window
int nheight = 200; // Height of the window
HWND hwndParent = m_hwnd; // Handle to the parent window
HWND hWndComboBox = CreateWindow(WC_COMBOBOX, TEXT(""),
CBS_DROPDOWN | CBS_HASSTRINGS | WS_CHILD | WS_OVERLAPPED | WS_VISIBLE,
xpos, ypos, nwidth, nheight, hwndParent, NULL, HINST_THISCOMPONENT,
NULL);
// load the combobox with item list.
// Send a CB_ADDSTRING message to load each item
TCHAR Planets[9][10] =
{
TEXT("Mercury"), TEXT("Venus"), TEXT("Terra"), TEXT("Mars"),
TEXT("Jupiter"), TEXT("Saturn"), TEXT("Uranus"), TEXT("Neptune"),
TEXT("Pluto??")
};
TCHAR A[16];
int k = 0;
memset(&A,0,sizeof(A));
for (k = 0; k <= 8; k += 1)
{
wcscpy_s(A, sizeof(A)/sizeof(TCHAR), (TCHAR*)Planets[k]);
// Add string to combobox.
SendMessage(hWndComboBox,(UINT) CB_ADDSTRING,(WPARAM) 0,(LPARAM) A);
}
// Send the CB_SETCURSEL message to display an initial item
// in the selection field
SendMessage(hWndComboBox, CB_SETCURSEL, (WPARAM)2, (LPARAM)0);
return hr;
}
/******************************************************************
* *
* The main window's message loop. *
* *
******************************************************************/
void DemoApp::RunMessageLoop()
{
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
/******************************************************************
* *
* The window's message handler. *
* *
******************************************************************/
LRESULT CALLBACK DemoApp::WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
LRESULT result = 0;
if (message == WM_CREATE)
{
LPCREATESTRUCT pcs = (LPCREATESTRUCT)lParam;
DemoApp *pDemoApp = (DemoApp *)pcs->lpCreateParams;
::SetWindowLongPtrW(
hwnd,
GWLP_USERDATA,
PtrToUlong(pDemoApp)
);
result = 1;
}
else
{
DemoApp *pDemoApp = reinterpret_cast<DemoApp *>(static_cast<LONG_PTR>(
::GetWindowLongPtrW(
hwnd,
GWLP_USERDATA
)));
bool wasHandled = false;
if (pDemoApp)
{
switch (message)
{
case WM_COMMAND:
if(HIWORD(wParam) == CBN_SELCHANGE)
// If the user makes a selection from the list:
// Send CB_GETCURSEL message to get the index of the selected list item.
// Send CB_GETLBTEXT message to get the item.
// Display the item in a messagebox.
{
int ItemIndex = SendMessage((HWND) lParam, (UINT) CB_GETCURSEL,
(WPARAM) 0, (LPARAM) 0);
TCHAR ListItem[256];
(TCHAR) SendMessage((HWND) lParam, (UINT) CB_GETLBTEXT,
(WPARAM) ItemIndex, (LPARAM) ListItem);
MessageBox(hwnd, (LPCWSTR) ListItem, TEXT("Item Selected"), MB_OK);
}
wasHandled = true;
result = 0;
break;
case WM_DISPLAYCHANGE:
{
InvalidateRect(hwnd, NULL, FALSE);
}
wasHandled = true;
result = 0;
break;
case WM_DESTROY:
{
PostQuitMessage(0);
}
wasHandled = true;
result = 1;
break;
}
}
if (!wasHandled)
{
result = DefWindowProc(hwnd, message, wParam, lParam);
}
}
return result;
}