- Added radio buttons

- Added radio button test to SettingsView
This commit is contained in:
andre@woesten.com 2008-09-03 13:54:38 +00:00
parent 8212d9ee41
commit 248b2eb33e
5 changed files with 312 additions and 1 deletions

View File

@ -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);

View File

@ -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

View 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);
}

View 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

View File

@ -356,6 +356,14 @@
RelativePath=".\ProgressBar.hpp"
>
</File>
<File
RelativePath=".\RadioButton.cpp"
>
</File>
<File
RelativePath=".\RadioButton.hpp"
>
</File>
<File
RelativePath=".\Window.cpp"
>