|
Specify the DS_CONTROL style for the 'child' dialog, and make parent its parent.
Software Zen: delete this;
|
|
|
|
|
I want to change the text of the statusbar inside an MDI application created with the appwizard. m_wndStatusBar.SetWindowText(text);
Now, running this, the text will not change. But, if you show a messageBox after that, the text will change. So, probably it is some sort of update/validate thing I have to do after the SetWindowText. I tried UpdateWindow(), but that's not it.
What is the function to force that?
using: [VISUAL STUDIO 6.0] [WIN98/2]
|
|
|
|
|
Maybe m_wndStatusBar.SetPaneText(0, text) works better...
rechi
|
|
|
|
|
I have been reading Michael Dunn's article about Custom Draw and the List Control to figure out how to change the background and text color to change on a selected item. I have tried the code below in both the pre and post paint stages. Also in both stages I have tryed returning both CDRF_DODEFAULT and CDRF_SKIPDEFAULT, either nothing happens.. or no selection highlight is drawn.
Anybody have any ideas? I'm lost with Custom Draw.. I don't understand why I can change the text/bk color for every item.. but if I test for a selected item, and then try and change the text/bk color.. nadda.. nothing .. zip..
<code>
void CPlayListWindow::OnCustomDrawList ( NMHDR* pNMHDR, LRESULT* pResult )
{
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );
*pResult = 0;
if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage)
*pResult = CDRF_NOTIFYITEMDRAW;
else if(CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage)
{
*pResult = CDRF_NOTIFYPOSTPAINT;
}
else if(CDDS_ITEMPOSTPAINT == pLVCD->nmcd.dwDrawStage)
{
LVITEM rItem;
int nItem = static_cast<int>( pLVCD->nmcd.dwItemSpec );
ZeroMemory ( &rItem, sizeof(LVITEM) );
rItem.mask = LVIF_IMAGE | LVIF_STATE;
rItem.iItem = nItem;
rItem.stateMask = LVIS_SELECTED;
GetListCtrl().GetItem(&rItem);
if(rItem.state == LVIS_SELECTED)
{
pLVCD->clrTextBk = RGB(0,0,255);
pLVCD->clrText = RGB(0,0,255);
*pResult = CDRF_SKIPDEFAULT;
}
}
}
</code>
C# a poor attempt at bringing C++ to the VB masses
|
|
|
|
|
I have been working from the same article just yesterday. Hers a copy of mu OnCustom draw...
void CCommunicationView::OnCustomDrawLog(NMHDR* pNMHDR, LRESULT* pResult)
{
NMLVCUSTOMDRAW *pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);
*pResult = CDRF_DODEFAULT;
if (CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage)
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
else if (CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage)
{
*pResult = CDRF_NOTIFYSUBITEMDRAW;
}
else if ((CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage)
{
int item = pLVCD->nmcd.dwItemSpec;
LVITEM rItem;
ZeroMemory(&rItem, sizeof(LVITEM));
rItem.mask = LVIF_IMAGE | LVIF_STATE;
rItem.iItem = item;
rItem.stateMask = LVIS_SELECTED;
m_Log.GetItem(&rItem );
int value = m_Log.GetItemData(item);
CDC* pDC = CDC::FromHandle ( pLVCD->nmcd.hdc );
CRect rcText;
CRect rcIcon;
CString text;
m_Log.GetItemRect(item, &rcIcon, LVIR_ICON);
m_Log.GetItemRect(item, &rcText, LVIR_BOUNDS);
rcText.left += rcIcon.Width();
text = m_Log.GetItemText(item, 0);
if (rItem.state & LVIS_SELECTED)
{
pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT));
CBrush brush(GetSysColor(COLOR_HIGHLIGHT));
pDC->FillRect(rcText, &brush);
}
else
{
pDC->SetTextColor(value);
CBrush brush(GetSysColor(COLOR_HIGHLIGHTTEXT));
pDC->FillRect(rcText, &brush);
}
pDC->DrawText(text, rcText, DT_END_ELLIPSIS | DT_EXPANDTABS | DT_SINGLELINE | DT_VCENTER);
pLVCD->clrText = value;
m_ilLog.Draw(pDC, rItem.iImage, rcIcon.TopLeft(), ILD_TRANSPARENT);
*pResult = CDRF_SKIPDEFAULT;
}
}
Roger Allen
Sonork 100.10016
Were you different as a kid? Did you ever say "Ooohhh, shiny red" even once? - Paul Watson 11-February-2003
|
|
|
|
|
Thanks for the quick reply. I got it working.. but I am still confused. I don't understand why I have to draw it out in the pre paint stage. Post paint I might be able to understand.. but I don't understand why I can loop through message for each Item, and change there colors using nmcd.clr...() but I can't check if the item is selected and use mncd to change color?????
C# a poor attempt at bringing C++ to the VB masses
|
|
|
|
|
Hi,
Stupid question perhaps but I want to create a component in MFC and I can't figure out how. The component I want to create is for a simulator of embedded software. The components are for example an AC-Motor. The Motor control has to be a rectangle containing a checkbox to enable/disable the overheat sensor another checkbox to enable/disable the state of the motor and a picture displaying a rotating icon indicating that the motor is running.
In a machine there are perhaps 20 motors. I want to create 20 instances of the control at run time. How should I create such a control? What class should I derive from and what events should I use. Maybe I need to create an ActiveX component????
Pleas help me getting started. Thanks in advance
PS. I have done dialog applications only till now.
|
|
|
|
|
Only another idea...
Why don't you create a dialog that contains all that stuff and then creates it as a control wherever you want to?
You could control all the controls and interact with whatever you want...
And then the only thing to do would be to create different instances of that dialog as a control...
You could even place some static texts in your dialog editor and then assign their ID and position to your newly created dialog... (if you do that, remember to destroy the Static control after having linked it's ID/position to your newly created dialog...)
Hope this helps...
|
|
|
|
|
Thanks,
This works for me!
Dennis
|
|
|
|
|
1) Yes you could create an ActiveX control. Just follow the documentation in any MFC book for creating an ActiveX control.
2) However I suggest you just take the easy way out: Put 20 instances of the CAnimateCtrl on your dialog, add the check boxes and you done. Or you could create them at run time in a for loop specifying the positioning if you want to. The whole thing should be up and running in 2 hours at the most. It sounds like a fun little project. Just remember if you use the CAnimateCtrl you must provide an AVI of RLE-8 format. But that's easy.
3) As an alternative and if you are using MFC 7 you could derive your Dialog from CDHTMLDialog instead of CDialog and build up an HTML page to display. MFC 7 support allows a very smooth interface with the HTML page and your code: far easier than manually embedding a Webbrowser control in the dialog as is done in MFC 6.
I wish I had your job.
Art
|
|
|
|
|
hello @all,
how can i make an integer to a global variable?
i must use it, in different classes (CDialogA, CDialogB, ...)!
thank you very much
sunny
|
|
|
|
|
Declare your variable in any .cpp file. Define it in a .h file as extern . Include this file whenever you need the variable.
|
|
|
|
|
thanks for reply.
i make this:
CDialogA:
int global_int;<br />
...<br />
<br />
void CDialogA::OnOk()<br />
{<br />
...<br />
global_int=5;<br />
...<br />
}
CDialogB:
extern int global_int;<br />
...<br />
void CDialogB::OnQuestion()<br />
{<br />
...<br />
int number=global_int;<br />
...<br />
}
but the number has not the same "content" as global_int in CDialogA. why?
can you help me?
sunny
|
|
|
|
|
What is the order of execution? CDialogA::OnOK() before CDialogB::OnQuestion() ? To sort it out, declare the variable and assign it a dummy value (may be zero), then check if number is zero or five.
|
|
|
|
|
oooohhhhhhhhh.....i know what´s wrong!!! thank you very very much....
João Paulo Figueira wrote:
What is the order of execution?
this was the point. i created a dialog at the beginning of my program and hide it and later i show it (inside this dialog was the problem). And so the order of execution was wrong!!!!!
thank you very very much.
sunny
|
|
|
|
|
How about this:
(a)
/// declaration
int iMyGlobalInteger = <whatever_suits_you>;
(b)
/// reference:
extern int iMyGlobalInteger;
(c) Reconsider all the above and change your plan. Global variables are evil. Whenever you have a global variable, you have a design flaw.
(d) Reconsider all the above. Whenever you don't know how to implement a global variable, you have a severe C language knowledge problem. This is very basic knowledge, if you don't mind me being frank. Stop whatever programming you're at right now. Stop it immediately. Go out, buy and read a good book on C/C++, then return to the design of the tool (see (c), above).
Bernd
|
|
|
|
|
thanks for reply.
i make it in the same way (a) and (b).
CDialogA:
<br />
int global_int;<br />
...<br />
<br />
void CDialogA::OnOk()<br />
{<br />
...<br />
global_int=5;<br />
...<br />
}
CDialogB:
<br />
extern int global_int;<br />
...<br />
void CDialogB::OnQuestion()<br />
{<br />
...<br />
int number=global_int;<br />
...<br />
}
but the number has not the same "content" as global_int in CDialogA. why?
that´s why i asked. can you help me?
sunny
|
|
|
|
|
Your code snippet doesn't indicate an error; I assume this is because you've reduced it too far for display in this thread.
Alternatively, you might be looking into the data at the wrong times? After all, CDialogA would only set the variable to 5 in its OnOk() handler; your snippet doesn't indicate when CDialogB::OnQuestion() occurs with relation to CDialogA::OnOk().
I can only repeat (c): global variables are evil and, with very rare exceptions, a good indicator for poor design.
Class A needs to communicate with class B? Send a message from A to B.
Any class needs to communicate with any other class? Implement a controller class as a central communications hub (see: singleton design pattern).
Any class needs to communicate with anything else in a haywired fashion in a way a singleton controller cannot resolve with elegance? Re-visit your design. Haywire comms is a bad sign, and a good indicator for poor design.
Bernd
|
|
|
|
|
You can do it in several ways:
1.
Declare it in a header file included in all the classes you need.
2.
Declare it in a cpp file and outside the class scope, and then try to reach it with the "extern" keyword.
3.
My favourite one:
In the Application object (typically "TheApp"), declare it inside the class that defines the application, and then reach the application object... (you can be almost sure that you'll be able to reach the header file that contains the application from every header or implementation file in your project.
MoreOver I would declare the variable as private and give the SET/GET interface functions in order to access it (in order to be more standard and to be able to check what is happening always and easily)...
Sample:
header file of the application
class CTCCApp : public CWinApp
{
public:
CTCCApp();
...
private:
int theIntegerVarToBeAccessed;
public:
int GetTheIntegerValue();
void SetTheIntegerValue(int iValue);
implementation file of the application
void CTCCApp::SetTheIntegerValue(int iValue)
{
theIntegerVarToBeAccessed = iValue;
}
int CTCCApp::GetIntegerValue()
{
return theIntegerVarToBeAccessed;
}
OK, now it's time to get access to those functions from everywhere you need...
Where you need to access that integer (let's say WHERE.cpp)
/*---------------------------------------------
COMMENTS FIRST
Be sure that you have a #include "TCCApp.h"; in your header or in your implementation file.
---------------------------------------------*/
//Inside the function where you want to access that:
extern CTCCApp TCCApp;
// Now you can get:
TCCApp.GetIntegerValue();
TCCApp.SetIntegerValue(10);
I think that this is the best method because you can "share" a lot of datatypes (even pointers to...) and you can make it in a safe and sorted way...
Hope this helps...
|
|
|
|
|
Does anybody have any experience of doing application integrated MailMerging in Openoffice.
I am looking produce an application to merge data into docs from a database, this project will be coded in various different languages (C++, C#, Java, etc)
Unfortunatly there doesnt seem to be any decent documentation with the OpenOffice SDK and google doesnt return much joy either
Regards
MR
|
|
|
|
|
OpenOffice? That crappy imitation of MS Office?
Well, you have the sources.
Good luck!
* you will need it *
I see dumb people
|
|
|
|
|
Ours is not to reason why......
Ours is just to do what da boss man says
|
|
|
|
|
Hi everyone. I have a dialog with a propertysheet with a tab control style. The propertysheet has 5 propertypages, all of the same class. I want each tab to have a different title on it, eg. "One", "Two", etc. Since they are all of the same class, I can't set the title statically. In the propertypage's OnInitDialog() I try to set the title, but it won't change the title on the tab. Is there a way to set the tab titles in the propertypage's OnInitDialog()? I could create 5 different dialog classes for each propertypage and could set the title statically, but that would be wasteful. I use the code below. It doesn't set the title. It also crashes when the program is in release mode, which I can't understand. Thanks for any help!
<br />
BOOL CDlgMyDialog::OnInitDialog() <br />
{<br />
CDialog::OnInitDialog();<br />
<br />
<br />
for(i = 0; i < 5; ++i)<br />
{<br />
m_ppgMyPropPages[i].SetMode(i);<br />
m_ppsMyPropSheet.AddPage(&m_ppgMyPropPage[i]);<br />
}<br />
<br />
m_ppsMyPropSheet.Create(this, WS_CHILD | WS_VISIBLE, 0);<br />
m_ppsMyPropSheet.ModifyStyleEx(0, WS_EX_CONTROLPARENT);<br />
m_ppsMyPropSheet.ModifyStyle(0, WS_TABSTOP);<br />
<br />
CRect rcSheet;<br />
GetDlgItem(IDC_PPS_MAIN)->GetWindowRect(&rcSheet);<br />
ScreenToClient(&rcSheet);<br />
m_ppsMyPropSheet.SetWindowPos(NULL, rcSheet.left- 7, rcSheet.top - 7, 0, 0,<br />
SWP_NOZORDER | SWP_NOSIZE);<br />
<br />
}<br />
<br />
BOOL CPpgMyPropPage::OnInitDialog() <br />
{<br />
CPropertyPage::OnInitDialog();<br />
<br />
if(m_iMode == 0)<br />
SetWindowText("One");<br />
if(m_iMode == 1)<br />
SetWindowText("Two");<br />
if(m_iMode == 2)<br />
SetWindowText("Three");<br />
if(m_iMode == 3)<br />
SetWindowText.SetWindowText("Four");<br />
if(m_iMode == 4)<br />
SetWindowText.SetWindowText("Five");<br />
<br />
<br />
}<br />
|
|
|
|
|
Take a look at this...
in the Constructor of the property sheet...
this->AddPage(&this->m_PPDlgParametritzacioDirectaEixos);
this->m_PPDlgParametritzacioDirectaEixos.m_psp.dwFlags |= PSP_USETITLE;
this->m_PPDlgParametritzacioDirectaEixos.m_psp.pszTitle = "Ejes";
Hope this helps...
|
|
|
|
|
Just Have a Look at the
http://www.codeguru.com/forum/printthread.php?threadid=224993
|
|
|
|