Re: CPropertySheet receiving tab from other control on dialog box
On Jan 31, 3:37 pm, David Lowndes <Dav...@example.invalid> wrote:
I already have the WS_EX_CONTROLPARENT style set.
I am not sure where to go from here. The control that is being tabbed
from to get to the property sheet is a user-defined control
Greg,
You said originally:
"I am not able to tab from the button or the radio button control to
my CPropertySheet control. "
... so which is it - a special user control, or a standard radio? Does
it make any difference (i.e. is some of your code in the user code
affecting the situation)?
Dave
Hi Dave,
The control is a special user control consisting of radio buttons.
The control is a dialog box that contains the radio buttons. I am not
sure why it was done this way. I inherited the code.
// LTCRadioButtons.cpp : implementation file
//
#include "stdafx.h"
#include "LTCRadioButtons.h"
#include "MainApplicationDlg.h"
#include "rulesstatic.h"
#include <stdlib.h>
#include <search.h>
#include "LTCRadioButton.h"
#define LTCRADIOBUTTONS_CLASSNAME _T("LTCRadioButtonsCtrl")
BOOL isShiftPressed;
BOOL isTabPressed;
LRESULT CALLBACK NewWindowProc(HWND, UINT, WPARAM, LPARAM);
// LTCRadioButtons dialog
IMPLEMENT_DYNAMIC(LTCRadioButtons, CDialog)
LTCRadioButtons::LTCRadioButtons(CWnd* pParent /*=NULL*/)
: CDialog(LTCRadioButtons::IDD, pParent)
, m_paint(false)
, b_losefocus(false)
{
RegisterWindowClass();
}
LTCRadioButtons::~LTCRadioButtons()
{
for (POSITION posRadio = m_radiobuttons.GetHeadPosition(); posRadio !
= NULL; ) {
CObject * obj = m_radiobuttons.GetNext(posRadio);
delete obj;
}
m_radiobuttons.RemoveAll();
}
void LTCRadioButtons::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(LTCRadioButtons, CDialog)
ON_WM_PAINT()
ON_WM_MBUTTONDOWN()
ON_WM_SETFOCUS()
ON_WM_KILLFOCUS()
END_MESSAGE_MAP()
// LTCRadioButtons message handlers
void LTCRadioButtons::getOptions(bool bFirstTime)
{
m_paint = false;
Type_aCArrayClass saSort;
if (m_sValue.CompareNoCase("") != 0) {
m_slOptions.RemoveAll();
CStringList ar;
CStringObject * value;
CString valueStr;
CMapStringToString sortList;
CString tmpCurrentValue;
POSITION pos;
POSITION posRadio;
ar.AddTail("userinterface");
ar.AddTail(m_sValue);
ar.AddTail("dataobject");
ar.AddTail("objectenabled");
value = (CStringObject*)CRulesStatic::s_dhIllustrationData-
get(&ar);
valueStr = value->GetString();
if (valueStr.CompareNoCase("1") == 0) {
this->EnableWindow(true);
}
else {
this->EnableWindow(false);
}
ar.RemoveTail();
ar.AddTail("objectvisible");
value = (CStringObject*)CRulesStatic::s_dhIllustrationData-
get(&ar);
valueStr = value->GetString();
if (valueStr.CompareNoCase("1") == 0) {
this->ShowWindow(SW_SHOW);
}
else {
this->ShowWindow(SW_HIDE);
}
ar.RemoveTail();
ar.AddTail("currentnormal");
value = (CStringObject*)CRulesStatic::s_dhIllustrationData-
get(&ar);
m_sCurrentNormalValue = value->GetString();
ar.RemoveTail();
ar.AddTail("dataoptions");
CStringList * str = CRulesStatic::s_dhIllustrationData-
getSortedKeys(&ar, "sortoptions", "displayvalue");
bool bNoRedraw;
bNoRedraw = (str->GetCount() == m_radiobuttons.GetCount());
for (pos = str->GetHeadPosition(); pos != NULL; ) {
CStringObject * key;
CString stemp;
CString s = str->GetNext(pos);
ar.AddTail(s);
ar.AddTail("nevervisible");
value = (CStringObject*)CRulesStatic::s_dhIllustrationData-
get(&ar);
stemp = value->GetString();
ar.RemoveTail();
m_bResetOptions &= (stemp.CompareNoCase("1") != 0);
ar.AddTail("optionavailable");
value = (CStringObject*)CRulesStatic::s_dhIllustrationData-
get(&ar);
stemp = value->GetString();
ar.RemoveTail();
if (!m_bResetOptions && (stemp && stemp.CompareNoCase("0") == 0)) {
ar.RemoveTail();
continue;
}
ar.AddTail("sortoptions");
key = (CStringObject*)CRulesStatic::s_dhIllustrationData->get(&ar);
ar.RemoveTail();
ar.AddTail("displayvalue");
value = (CStringObject*)CRulesStatic::s_dhIllustrationData-
get(&ar);
ar.RemoveTail();
m_slOptions.AddTail(s);
ar.RemoveTail();
sortList.SetAt(s, value->GetString());
if (s.CompareNoCase(m_sCurrentNormalValue) == 0) {
ar.RemoveTail();
ar.AddTail("currentdisplay");
CRulesStatic::s_dhIllustrationData->put(&ar, value->GetString());
ar.RemoveTail();
tmpCurrentValue = value->GetString();
ar.AddTail("dataoptions");
}
bool bFound;
bFound = false;
for (posRadio = m_radiobuttons.GetHeadPosition(); posRadio !=
NULL; ) {
LTCRadioButton * butt =
(LTCRadioButton*)m_radiobuttons.GetNext(posRadio);
CString strDisplay;
butt->GetWindowText(strDisplay);
if (strDisplay.CompareNoCase(value->GetString()) == 0) {
bFound = true;
break;
}
}
bNoRedraw &= bFound;
}
if (!bNoRedraw) {
for (posRadio = m_radiobuttons.GetHeadPosition(); posRadio !=
NULL; ) {
CObject * obj = m_radiobuttons.GetNext(posRadio);
delete obj;
}
m_radiobuttons.RemoveAll();
int yTop = 0;
int yBottom = 15;
int xLeft = 0;
int xRight;
int uniqueIndex = 5;
for (posRadio = str->GetHeadPosition(); posRadio != NULL; ) {
CString lookupValue;
CString lookupKey = str->GetNext(posRadio);
sortList.Lookup(lookupKey, lookupValue);
LTCRadioButton * butt = new LTCRadioButton(this);
CBaseInputPropertyPage * cParent = (CBaseInputPropertyPage
*)GetParent();
CFont * f = cParent->m_cCoverageTypeSingleRadioBttn->GetFont();
CDC *cDC = this->GetDC();
if(cDC == NULL) {
AfxMessageBox("Context Device for LTCRadioButtons is NULL");
return;
}
CSize cSize = cDC->GetTextExtent(lookupValue);
xRight = xLeft + cSize.cx;
this->ReleaseDC(cDC);
butt->Create(_T(lookupValue), WS_CHILD|WS_VISIBLE|
BS_AUTORADIOBUTTON, CRect(xLeft, 0, xRight + 10 ,15), this, uniqueIndex
++);
butt->SetFont(f);
butt->ShowWindow(SW_SHOW);
m_radiobuttons.AddTail(butt);
AttachThreadInput(GetWindowThreadProcessId(this->GetParent()-
GetSafeHwnd(),NULL),GetWindowThreadProcessId(butt->GetSafeHwnd(),
NULL),TRUE);
// yTop = (yBottom + 5);
// yBottom = (yTop + 15);
xLeft += xRight + 20;
}
}
for (pos = m_radiobuttons.GetHeadPosition(); pos != NULL; ) {
LTCRadioButton * butt =
(LTCRadioButton*)m_radiobuttons.GetNext(pos);
CString strDisplay;
butt->GetWindowText(strDisplay);
if (strDisplay.CompareNoCase(tmpCurrentValue) == 0) {
butt->SetCheck(1);
} else {
butt->SetCheck(0);
}
}
if (str) {
str->RemoveAll();
delete str;
}
m_bResetOptions = false;
m_paint = true;
}
}
int LTCRadioButtons::compare(const void * arg1, const void * arg2)
{
int i = 0;
CArrayClass* a1 = (CArrayClass*)arg1;
CArrayClass* a2 = (CArrayClass*)arg2;
if (atoi(a1->m_strMsgType) < atoi(a2->m_strMsgType)) {
i = -1;
}
if (atoi(a1->m_strMsgType) > atoi(a2->m_strMsgType)) {
i = 1;
}
return i;
}
bool LTCRadioButtons::IsInError(void)
{
bool b = (m_slOptions.Find(m_sCurrentNormalValue) == NULL);
return (b);
}
void LTCRadioButtons::SetCurrentValue()
{
CStringList ar;
CObject * obj;
for (POSITION pos = m_radiobuttons.GetHeadPosition(); pos != NULL; )
{
LTCRadioButton * butt =
(LTCRadioButton*)m_radiobuttons.GetNext(pos);
if (butt->GetCheck() == 1) {
butt->GetWindowText(m_sCurrentValue);
break;
}
}
ar.AddTail(m_sValue);
ar.AddTail(m_sCurrentValue);
obj = CRulesStatic::s_dhNormalValues->get(&ar);
if(obj && obj->IsKindOf(RUNTIME_CLASS(CStringObject))) {
CStringObject *value = (CStringObject *)obj;
m_sCurrentNormalValue = value->GetString();
}
}
void LTCRadioButtons::ProcessClicked(void)
{
CMainApplicationDlg* cParent = (CMainApplicationDlg*)this-
GetParent();
cParent->processRadioBttnClick();
}
bool LTCRadioButtons::RegisterWindowClass(void)
{
WNDCLASS wndcls;
HINSTANCE hInst = AfxGetInstanceHandle();
if (!(::GetClassInfo(hInst, LTCRADIOBUTTONS_CLASSNAME, &wndcls))) {
wndcls.style = CS_DBLCLKS | CS_HREDRAW |
CS_VREDRAW;
wndcls.lpfnWndProc = NewWindowProc;
wndcls.cbClsExtra = wndcls.cbWndExtra = 0;
wndcls.hInstance = hInst;
wndcls.hIcon = NULL;
wndcls.hCursor = AfxGetApp()-
LoadStandardCursor(IDC_ARROW);
wndcls.hbrBackground = (HBRUSH) (COLOR_3DFACE + 1);
wndcls.lpszMenuName = NULL;
wndcls.lpszClassName = LTCRADIOBUTTONS_CLASSNAME;
if (!AfxRegisterClass(&wndcls))
{
AfxThrowResourceException();
return FALSE;
}
}
return TRUE;
}
void LTCRadioButtons::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// Do not call __super::OnPaint() for painting messages
}
BOOL LTCRadioButtons::OnInitDialog()
{
__super::OnInitDialog();
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void LTCRadioButtons::OnSetFocus(CWnd* pOldWnd)
{
CWnd *wnd;
wnd = GetWindow(GW_CHILD);
for (POSITION posRadio = m_radiobuttons.GetHeadPosition(); posRadio !
= NULL; ) {
LTCRadioButton * butt =
(LTCRadioButton*)m_radiobuttons.GetNext(posRadio);
if (butt->GetCheck() == 1) {
wnd = butt;
}
}
wnd->SetFocus();
b_losefocus = true;
}
void LTCRadioButtons::OnKillFocus(CWnd* pNewWnd)
{
b_losefocus = false;
}
LRESULT CALLBACK NewWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam,
LPARAM lParam)
{
if (uMsg == WM_KEYUP) {
if (wParam == VK_TAB) {
int iState = GetKeyState(VK_SHIFT);
UINT uState = (iState < 0 ? GW_HWNDPREV : GW_HWNDNEXT);
HWND hTop = GetWindow(hWnd, (iState < 0 ? GW_HWNDFIRST :
GW_HWNDLAST));
HWND wnd = GetWindow(hWnd, uState);
while (!IsWindowEnabled(wnd) && wnd != hTop) {
wnd = GetWindow(wnd, uState);
}
SetFocus(IsWindowEnabled(wnd) ? wnd : hWnd);
return 0;
}
}
return CallWindowProc(::DefWindowProc, hWnd, uMsg, wParam, lParam);
}