diff --git a/src/cube/SettingsView.cpp b/src/cube/SettingsView.cpp index 75877a022..ca63c8def 100644 --- a/src/cube/SettingsView.cpp +++ b/src/cube/SettingsView.cpp @@ -41,6 +41,7 @@ #include #include #include +#include #include #include @@ -126,6 +127,32 @@ void SettingsView::OnCreated() c2->SetIndeterminate(); c2->Pressed.connect(this, &SettingsView::OnPressTestCheckbox); + // test radio buttons + RadioButton* r11 = new RadioButton(_T("Group 1: Button A")); + mainLayout->AddChild(r11); + + RadioButton* r12 = new RadioButton(_T("Group 1: Button B"), r11); + mainLayout->AddChild(r12); + + RadioButton* r13 = new RadioButton(_T("Group 1: Button C"), r12); + mainLayout->AddChild(r13); + + RadioButton* r21 = new RadioButton(_T("Group 2: Button A")); + mainLayout->AddChild(r21); + + RadioButton* r22 = new RadioButton(_T("Group 2: Button B"), r21); + mainLayout->AddChild(r22); + + RadioButton* r23 = new RadioButton(_T("Group 2: Button C"), r22); + mainLayout->AddChild(r23); + + r11->Check(); r12->Check(); r13->Check(); + r21->Check(); r22->Check(); + + RadioButton* checked = r11->GetCheckedInGroup(); + if(checked) ::MessageBox(NULL, checked->Caption().c_str(), _T("test"), MB_OK); + checked = r22->GetCheckedInGroup(); + if(checked) ::MessageBox(NULL, checked->Caption().c_str(), _T("test"), MB_OK); this->AddChild(mainLayout); diff --git a/src/win32cpp/Checkbox.hpp b/src/win32cpp/Checkbox.hpp index 8871a0392..1633dceae 100644 --- a/src/win32cpp/Checkbox.hpp +++ b/src/win32cpp/Checkbox.hpp @@ -52,7 +52,7 @@ class Checkbox; ///\brief ///The type of event used when the Checkbox is pressed.. ///\see -///Button. +///CheckBox. typedef sigslot::signal2 CheckboxPressedEvent; ///\brief diff --git a/src/win32cpp/RadioButton.cpp b/src/win32cpp/RadioButton.cpp new file mode 100644 index 000000000..8db91b781 --- /dev/null +++ b/src/win32cpp/RadioButton.cpp @@ -0,0 +1,179 @@ +////////////////////////////////////////////////////////////////////////////// +// +// License Agreement: +// +// The following are Copyright © 2008, Casey Langen, André Wösten +// +// Sources and Binaries of: win32cpp +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// * Neither the name of the author nor the names of other contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +////////////////////////////////////////////////////////////////////////////// + +#include +#include +#include + +////////////////////////////////////////////////////////////////////////////// + +using namespace win32cpp; + +////////////////////////////////////////////////////////////////////////////// + +///\brief +///Constructor. +/// +///\param caption +///The caption beside the radio button +/*ctor*/ RadioButton::RadioButton(const uichar* caption, RadioButton* prev) +: base() +, caption(caption) +, prev(prev) +, next(NULL) +{ +} + +/*dtor*/ RadioButton::~RadioButton() +{ + // fix linked list after deletion of an item + if(this->prev) { + if(this->next) { + this->prev->next = this->next; + } else { + this->prev->next = NULL; + } + } + + if(this->next) { + if(this->prev) { + this->next->prev = this->prev; + } else { + this->next->prev = NULL; + } + } +} + +HWND RadioButton::Create(Window* parent) +{ + HINSTANCE hInstance = Application::Instance(); + + // create the window + DWORD style = WS_CHILD | WS_VISIBLE | BS_NOTIFY | BS_AUTORADIOBUTTON; + if(this->prev == NULL) { + style |= WS_GROUP; + } else { + this->prev->next = this; + } + // + HWND hwnd = CreateWindowEx( + NULL, // ExStyle + _T("BUTTON"), // Class name + this->caption.c_str(), // Window name + style, // Style + 0, // X + 0, // Y + 64, // Width + 32, // Height + parent->Handle(), // Parent + NULL, // Menu + hInstance, // Instance + NULL); // lParam + + return hwnd; +} + +LRESULT RadioButton::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_COMMAND: + switch (HIWORD(wParam)) + { + case BN_CLICKED: + this->OnPressed(); + + return 0; + } + } + + return this->DefaultWindowProc(message, wParam, lParam); +} + +void RadioButton::OnPressed() +{ + this->Pressed(this); +} + +void RadioButton::PaintToHDC(HDC hdc, const Rect& rect) +{ + this->WindowProc(WM_PAINT, (WPARAM) (HDC) hdc, PRF_CLIENT); + + if (::GetFocus() == this->Handle()) + { + RECT focusRect = rect; + ::InflateRect(&focusRect, -4, -4); + ::DrawFocusRect(hdc, &focusRect); + } +} + +RadioButton* RadioButton::GetCheckedInGroup(void) +{ + RadioButton* traverser = const_cast(this); + + // check this item first + if(traverser->IsChecked()) { + return traverser; + } + + // traverse to first item on list + while(traverser->prev != NULL) { + traverser = traverser->prev; + } + + // traverse through whole list to find active icon + while(traverser != NULL) { + if(traverser->SendMessage(BM_GETCHECK, 0, 0) == BST_CHECKED) { + return traverser; + } + traverser = traverser->next; + } + + return NULL; +} + +bool RadioButton::IsChecked(void) +{ + return (this->SendMessage(BM_GETCHECK, 0, 0) == BST_CHECKED); +} + +void RadioButton::Check(void) +{ + // we need to emulate a click. otherwise the other radio buttons don't get unchecked :-) + SendMessage(BM_CLICK, 0, 0); +} \ No newline at end of file diff --git a/src/win32cpp/RadioButton.hpp b/src/win32cpp/RadioButton.hpp new file mode 100644 index 000000000..e6df5dbe3 --- /dev/null +++ b/src/win32cpp/RadioButton.hpp @@ -0,0 +1,97 @@ +////////////////////////////////////////////////////////////////////////////// +// +// License Agreement: +// +// The following are Copyright © 2008, Casey Langen, André Wösten +// +// Sources and Binaries of: win32cpp +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// * Neither the name of the author nor the names of other contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once + +////////////////////////////////////////////////////////////////////////////// + +#include +#include + +namespace win32cpp { + +////////////////////////////////////////////////////////////////////////////// + +class RadioButton; + +///\brief +///The type of event used when the Checkbox is pressed. +///\see +///RadioButton. +typedef sigslot::signal1 RadioButtonPressedEvent; + +///\brief +///A standard RadioButton. +///They are organised as linked list to enforce the grouping behaviour +class RadioButton : public Window +{ +private: // types + typedef Window base; + +public: // events + ///\brief This event is emitted when the user presses the RadioButton + RadioButtonPressedEvent Pressed; + +public: // constructors + /*ctor*/ RadioButton(const uichar* caption = _T(""), RadioButton* attach = NULL); + /*dtor*/ ~RadioButton(); + +protected: // methods + virtual HWND Create(Window* parent); + virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam); + virtual void OnPressed(); + virtual void PaintToHDC(HDC hdc, const Rect& rect); + +public: + void Check(void); + bool IsChecked(void); + + RadioButton* GetCheckedInGroup(void); + + // for testing + uistring Caption(void) const { return caption; } + +protected: // instance data + RadioButton* prev; // previous item, NULL if group begin + RadioButton* next; // next item, NULL if group ends + uistring caption; +}; + +////////////////////////////////////////////////////////////////////////////// + +} // win32cpp diff --git a/src/win32cpp/win32cpp.vcproj b/src/win32cpp/win32cpp.vcproj index 48deaf301..4efdc4683 100644 --- a/src/win32cpp/win32cpp.vcproj +++ b/src/win32cpp/win32cpp.vcproj @@ -356,6 +356,14 @@ RelativePath=".\ProgressBar.hpp" > + + + +