#include <UIAutomationClient.h>
#include <UIAutomationCoreApi.h>
#include <new>
+#include <string>
#include <stdio.h>
HRESULT ButtonProvider::CreateInstance(HWND hwnd, IRawElementProviderSimple **ppProvider)
else if (propertyId == UIA_NamePropertyId)
{
int len = GetWindowTextLengthW(_hwnd) + 1;
- wchar_t *name = new (std::nothrow) wchar_t[len]();
- GetWindowTextW(_hwnd, name, len);
+ std::wstring name(len - 1, L'\0');
+ GetWindowTextW(_hwnd, name.data(), len);
pVal->vt = VT_BSTR;
- pVal->bstrVal = SysAllocString(name);
- delete[] name;
+ pVal->bstrVal = SysAllocString(name.c_str());
}
else
{
hr = static_cast<HRESULT>(UIA_E_ELEMENTNOTAVAILABLE);
else
{
- auto state = SendMessage(_hwnd, BM_GETCHECK, WPARAM(0), LPARAM(0));
+ int state = static_cast<int>(SendMessage(_hwnd, BM_GETCHECK, WPARAM(0), LPARAM(0)));
*pVal = (state == BST_CHECKED) ? ToggleState_On : ToggleState_Off;
hr = S_OK;
}
STDMETHOD(get_ToggleState)(ToggleState *pVal);
private:
- ButtonProvider() : _refcount(0), _hwnd(HWND_DESKTOP) {}
+ ButtonProvider() = delete;
ButtonProvider(HWND hwnd) : _refcount(0), _hwnd(hwnd) {}
virtual ~ButtonProvider() {}
unsigned long _refcount;
#include <new>
#include <string>
#include <vector>
+#include <memory>
static LRESULT CALLBACK WndProc(HWND hwnd, UINT messageId, WPARAM wparam, LPARAM lparam);
return Gdiplus::RectF(float(rc.X), float(rc.Y), float(rc.Width), float(rc.Height));
}
-std::vector<Gdiplus::Point> CalculatePoints(Gdiplus::Rect rc, int sidesCount)
+static std::vector<Gdiplus::Point> CalculatePoints(Gdiplus::Rect rc, int sidesCount)
{
std::vector<Gdiplus::Point> points;
Gdiplus::Point center(rc.Width / 2, rc.Height / 2);
return points;
}
-void PolyButton::OnPaint()
+void PolyButton::OnPaint() const
{
PAINTSTRUCT ps = {0};
RECT rc;
format.SetAlignment(Gdiplus::StringAlignmentCenter);
format.SetLineAlignment(Gdiplus::StringAlignmentCenter);
int len = GetWindowTextLength(_hwnd) + 1;
- wchar_t *label = new wchar_t[len]();
- GetWindowTextW(_hwnd, label, len);
- g.DrawString(label, len, &font, layoutRect, &format, &textBrush);
- delete [] label;
+ std::wstring label(len - 1, L'\0');
+ GetWindowTextW(_hwnd, label.data(), len);
+ g.DrawString(label.c_str(), len, &font, layoutRect, &format, &textBrush);
}
if ((_state & PolyButtonState::Focussed) == PolyButtonState::Focussed)
DrawFocusRect(hdc, &rc);
}
InvalidateRect(_hwnd, nullptr, TRUE);
}
-}
\ No newline at end of file
+}
void InvokeButton();
static void RegisterControl(HINSTANCE instance);
bool IsChecked() const { return ((_state & PolyButtonState::Checked) == PolyButtonState::Checked); }
- void OnPaint();
+ void OnPaint() const;
void OnSetFocus();
void OnKillFocus();
private:
- PolyButton() {}
+ PolyButton() = delete;
HWND _hwnd;
PolyButtonState _state;
int _sides;
#include <Windows.h>
#include <gdiplus.h>
+#include <CommCtrl.h>
#include "resource.h"
#include "PolyButton.h"
#pragma comment(lib, "uiautomationcore")
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
+static LPCTSTR comboItems[] = { TEXT("One"), TEXT("Two"), TEXT("Three"), TEXT("Four") };
+
static INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM /*lParam*/)
{
switch (message)
{
+ case WM_INITDIALOG:
+ {
+ HWND hwndCombo = GetDlgItem(hDlg, IDC_COMBO1);
+ HWND hwndComb2 = GetDlgItem(hDlg, IDC_COMBO2);
+ HWND hwndList = GetDlgItem(hDlg, IDC_LIST1);
+ HWND hwndCombx = GetDlgItem(hDlg, IDC_COMBOBOXEX1);
+ COMBOBOXEXITEM item = { 0 };
+ item.mask = CBEIF_TEXT;
+ item.iItem = -1;
+ for (size_t ndx = 0; ndx < sizeof(comboItems) / sizeof(comboItems[0]); ++ndx)
+ {
+ SendMessage(hwndCombo, CB_ADDSTRING, 0, reinterpret_cast<LPARAM>(comboItems[ndx]));
+ SendMessage(hwndComb2, CB_ADDSTRING, 0, reinterpret_cast<LPARAM>(comboItems[ndx]));
+ SendMessage(hwndList, LB_ADDSTRING, 0, reinterpret_cast<LPARAM>(comboItems[ndx]));
+ item.pszText = const_cast<LPTSTR>(comboItems[ndx]);
+ SendMessage(hwndCombx, CBEM_INSERTITEM, 0, reinterpret_cast<LPARAM>(&item));
+ }
+ break;
+ }
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
return FALSE;
}
-int PASCAL
-WinMain(HINSTANCE hinst, HINSTANCE, LPSTR, int)
+int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
{
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken(0);
- Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
- CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
- PolyButton::RegisterControl(hinst);
- DialogBox(hinst, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
- CoUninitialize();
+ Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, nullptr);
+ HRESULT hr = ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
+ if (SUCCEEDED(hr))
+ {
+ PolyButton::RegisterControl(hInstance);
+ DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), nullptr, DlgProc);
+ CoUninitialize();
+ }
Gdiplus::GdiplusShutdown(gdiplusToken);
return 0;
}
// TEXTINCLUDE
//
-1 TEXTINCLUDE
+1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
-2 TEXTINCLUDE
+2 TEXTINCLUDE
BEGIN
"#include <winres.h>\r\n"
"\0"
END
-3 TEXTINCLUDE
+3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
// Dialog
//
-IDD_DIALOG1 DIALOGEX 0, 0, 309, 176
+IDD_DIALOG1 DIALOGEX 0, 0, 275, 173
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "UIA Custom Control Demo"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
GROUPBOX "Static",IDC_STATIC,7,18,105,38
CONTROL "Option 1",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,15,28,91,10
CONTROL "Option 2",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,15,42,92,10
- LTEXT "Label",IDC_STATIC,7,62,18,8
- EDITTEXT IDC_EDIT1,33,59,100,14,ES_AUTOHSCROLL
- CONTROL "Hello",IDC_CUSTOM1,"POLYBUTTON",WS_TABSTOP,15,82,60,27
- DEFPUSHBUTTON "OK",IDOK,198,155,50,14
- PUSHBUTTON "Cancel",IDCANCEL,252,155,50,14
+ LTEXT "Things",IDC_STATIC,125,7,22,8
+ LISTBOX IDC_LIST1,151,7,117,40,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
+ LTEXT "Edit",IDC_STATIC,7,62,31,8
+ EDITTEXT IDC_EDIT1,44,59,101,14,ES_AUTOHSCROLL
+ LTEXT "Combo",IDC_STATIC,7,81,31,8
+ COMBOBOX IDC_COMBO1,44,79,101,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ LTEXT "EditCombo",IDC_STATIC,153,81,35,8
+ COMBOBOX IDC_COMBO2,191,79,77,30,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
+ LTEXT "ComboEx",IDC_STATIC,7,98,31,8
+ CONTROL "",IDC_COMBOBOXEX1,"ComboBoxEx32",CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP,44,97,101,38
+ CONTROL "Hello",IDC_CUSTOM1,"POLYBUTTON",WS_TABSTOP,21,119,46,40
+ LTEXT "Text",IDC_STATIC,73,116,16,8
+ EDITTEXT IDC_EDIT2,95,116,173,33,ES_MULTILINE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_VSCROLL
+ DEFPUSHBUTTON "OK",IDOK,166,152,50,14
+ PUSHBUTTON "Cancel",IDCANCEL,218,152,50,14
END
IDD_DIALOG1, DIALOG
BEGIN
LEFTMARGIN, 7
- RIGHTMARGIN, 302
+ RIGHTMARGIN, 268
TOPMARGIN, 7
- BOTTOMMARGIN, 169
+ BOTTOMMARGIN, 166
END
END
#endif // APSTUDIO_INVOKED
// Microsoft Visual C++ generated include file.
// Used by main.rc
//
-
-#define IDD_DIALOG1 101
-#define IDC_CHECK1 102
-#define IDC_RADIO1 103
-#define IDC_RADIO2 104
-#define IDC_EDIT1 105
-#define IDC_CUSTOM1 106
+#define IDD_DIALOG1 101
+#define IDC_CHECK1 102
+#define IDC_RADIO1 103
+#define IDC_RADIO2 104
+#define IDC_EDIT1 105
+#define IDC_CUSTOM1 106
+#define IDC_COMBO1 1005
+#define IDC_COMBOBOXEX1 1006
+#define IDC_COMBO2 1007
+#define IDC_LIST1 1008
+#define IDC_EDIT2 1009
// Next default values for new objects
//
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 103
#define _APS_NEXT_COMMAND_VALUE 40001
-#define _APS_NEXT_CONTROL_VALUE 1005
+#define _APS_NEXT_CONTROL_VALUE 1010
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif