mirror of
https://github.com/clangen/musikcube.git
synced 2025-01-01 17:58:29 +00:00
- Added radio buttons
- Added radio button test to SettingsView
This commit is contained in:
parent
8212d9ee41
commit
248b2eb33e
@ -41,6 +41,7 @@
|
||||
#include <win32cpp/LinearLayout.hpp>
|
||||
#include <win32cpp/Button.hpp>
|
||||
#include <win32cpp/Checkbox.hpp>
|
||||
#include <win32cpp/RadioButton.hpp>
|
||||
#include <win32cpp/ListView.hpp>
|
||||
#include <win32cpp/Label.hpp>
|
||||
|
||||
@ -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);
|
||||
|
||||
|
@ -52,7 +52,7 @@ class Checkbox;
|
||||
///\brief
|
||||
///The type of event used when the Checkbox is pressed..
|
||||
///\see
|
||||
///Button.
|
||||
///CheckBox.
|
||||
typedef sigslot::signal2<Checkbox*, int> CheckboxPressedEvent;
|
||||
|
||||
///\brief
|
||||
|
179
src/win32cpp/RadioButton.cpp
Normal file
179
src/win32cpp/RadioButton.cpp
Normal file
@ -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 <pch.hpp>
|
||||
#include <win32cpp/RadioButton.hpp>
|
||||
#include <win32cpp/Application.hpp>
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
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<RadioButton*>(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);
|
||||
}
|
97
src/win32cpp/RadioButton.hpp
Normal file
97
src/win32cpp/RadioButton.hpp
Normal file
@ -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 <win32cpp/Win32Config.hpp>
|
||||
#include <win32cpp/Window.hpp>
|
||||
|
||||
namespace win32cpp {
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class RadioButton;
|
||||
|
||||
///\brief
|
||||
///The type of event used when the Checkbox is pressed.
|
||||
///\see
|
||||
///RadioButton.
|
||||
typedef sigslot::signal1<RadioButton*> 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
|
@ -356,6 +356,14 @@
|
||||
RelativePath=".\ProgressBar.hpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\RadioButton.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\RadioButton.hpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Window.cpp"
|
||||
>
|
||||
|
Loading…
Reference in New Issue
Block a user