|
almc wrote: Not much help...
So start peeling away little bits of code until you are left with only what's necessary to reproduce the problem.
"Talent without discipline is like an octopus on roller skates. There's plenty of movement, but you never know if it's going to be forward, backwards, or sideways." - H. Jackson Brown, Jr.
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
Hello,
For what I can see, if I change the thread so that I can call it as a function, the problem also happens... So it's not a thread thing.
But I don't know hat else can I do...
Any ideas?
Thanks for you time.
ALMC
|
|
|
|
|
Hi,
Can we use a bitmap as a background to a dialog by writing the suitable code in OninitDialog function .
Thanks in advance,
Radhika.
|
|
|
|
|
radhika28 wrote: bitmap as a background to a dialog
See WM_PAINT:
Use BitBlt()/StretchBlt() if you want to set the image as a background on the dialog
Somethings seem HARD to do, until we know how to do them.
_AnShUmAn_
|
|
|
|
|
See
<br />
#include AtlImage.h<br />
CImage m_Image;<br />
<br />
m_Image.Load("c:\\0.bmp");<br />
<br />
void CanswerDlg::OnPaint() <br />
{<br />
CPaintDC dc(this);
m_Image.BitBlt(dc.m_hDC,0,0,640,480,0,0);<br />
}<br />
<br />
|
|
|
|
|
I need to find the Spanish and Italian translation of the text which is displayed on the windows message box buttons: OK, Yes, No and Retry. Can anyone provide them, or point me to somewhere where I'd find them myself? I also need the translation of the the word "Back" (as in back to the previous menu) for French, German, Spanish and Italian - google translator seems to interpret it as back-side!
Joel Holdsworth
|
|
|
|
|
Joel, i think you can ask this in the Lounge... it is general enough to be asked there
moreover, you'll get more answers, as the Lounge counts much more people, coming from different technical forums...
|
|
|
|
|
AFAIK, microsoft has a web page with translation of the common "microsoft" control text. Search the msdn for that, or even this forum, there was a thread about that recently.
~RaGE();
I think words like 'destiny' are a way of trying to find order where none exists. - Christian Graus
|
|
|
|
|
yes, he asked it this morning
|
|
|
|
|
I have an edit box and its variable is m_strEdit.Its a multiline edit box.
I want to shwo two string in two lines in that edit box and i have written like this,
......<br />
UpdateData();<br />
m_strEdit = "one"+"\n"+"two";<br />
UpdateData(false);<br />
......
but its showing it as
one|two
in the edit box.
How to solve this.
KIRAN PINJARLA
|
|
|
|
|
Turn the want return property of the edit box to true.(If you like to)
m_strEdit = "one"+"\r\n"+"two";
Somethings seem HARD to do, until we know how to do them.
_AnShUmAn_
|
|
|
|
|
Hi,
I need to detect whether is left mouse button is down..
Do you want how do it?
I uset ::GetCursorPos() but I need to detect mouse flags too..
Thanks
|
|
|
|
|
|
In the properties pane there are messages which you can override.
If you override WM_LBUTTONDOWN it should generate a routine called OnLButtonDown.
At least this is the way I do it.
Hope this is what you are looking for.
|
|
|
|
|
majco333 wrote: ::GetCursorPos() but I need to detect mouse flags too..
case WM_MOUSEMOVE:
if(wParam & MK_LBUTTON)
{
}
break;
Hope that I understood you correctly
Somethings seem HARD to do, until we know how to do them.
_AnShUmAn_
|
|
|
|
|
I know but I need to detect mouse flags out of child window...
|
|
|
|
|
Can you clarify what exactly do you want to do?
Somethings seem HARD to do, until we know how to do them.
_AnShUmAn_
|
|
|
|
|
I have own CWnd object. I need to detect mouse flags when mouse is out of this CWnd object. For example, I to handle mouse move in this
CWnd object but I want to handle mouse move when mouse is out this object.
I wand correct to handle mouse move in this object. Because in this object
is image and I need to change XOffset and YOffset by mouse move - do not only in CWnd object but out of CWnd object too...
|
|
|
|
|
I have a dialog bar (similar to a dialog box) where I have a number of different objects. Now I have a request to write the patient name in a large font in red. I don't have a clue how to do this.
Usually one uses OnDraw(CDC *pDC) where the pDC allows you to draw what you want. For a dialog bar or a dialog box there is no OnDraw and the system does the work for you.
The only way I can think of is to make a bitmap file, where I draw into the bitmap what I want and then I display the bitmap as a picture. This is awkward especially as the program will generally be run from a CD which has no write possibilities.
There must be a better way, the question is can anyone suggest what it is?
Thanks,
Ilan
|
|
|
|
|
First of all, few aside notes:
- A dialog bar is not quite similar to a dialog box, although both can be based on a dialog template.
That because CDialogBar is not derived from CDialog but from CControlBar.
- OnDraw is a virtual member function of CView which is called from within WM_PAINT message handler (OnPaint). Neither CDialog, nor CDialogBar have OnDraw method.
- If you need a text in a dialog box or a dialog bar is easier to put it in a static or edit control rather than drawing it in WM_PAINT message handler.
Given these said, I would like to suggest to derive from CDialogBar, make some "cosmetics", i.e. adding WM_INITDIALOG message handler (CDialogBar has not OnInitDialog virtual function like CDialog), change the edit's font in that handler, and finally set the edit's text color in WM_CTLCOLOR message handler.
Here is a sample code:
class CMyDialogBar : public CDialogBar
{
public:
CMyDialogBar();
protected:
afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
afx_msg LRESULT OnInitDialog (WPARAM wParam, LPARAM lParam);
DECLARE_MESSAGE_MAP()
};
MyDialogBar::CMyDialogBar()
{
}
void CMyDialogBar::DoDataExchange(CDataExchange* pDX)
{
CDialogBar::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CMyDialogBar, CDialogBar)
ON_WM_CTLCOLOR()
ON_MESSAGE(WM_INITDIALOG, OnInitDialog)
END_MESSAGE_MAP()
LRESULT CMyDialogBar::OnInitDialog (WPARAM wParam, LPARAM lParam)
{
if (!HandleInitDialog(wParam, lParam) || !UpdateData(FALSE))
{
TRACE0("Warning: UpdateData failed during dialog init.\n");
return (LRESULT)0;
}
CFont font;
font.CreatePointFont(140, _T("Times New Roman"));
CWnd* pEdit = GetDlgItem(IDC_EDIT_PATIENT);
_ASSERTE(NULL != pEdit);
pEdit->SetFont(&font);
font.Detach();
return (LRESULT)1;
}
HBRUSH CMyDialogBar::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialogBar::OnCtlColor(pDC, pWnd, nCtlColor);
if(pWnd->m_hWnd == GetDlgItem(IDC_EDIT_PATIENT)->GetSafeHwnd())
{
pDC->SetTextColor(RGB(255,0,0));
hbr = (HBRUSH)::GetStockObject(WHITE_BRUSH);
}
return hbr;
}
Ovidiu Cucu
Microsoft MVP - Visual C++
|
|
|
|
|
Thank you for your reply which I didn't see until this morning. Usually it sends me mail when someone replies and since I received no mail I didn't know that you had replied.
I came up with another solution, where basically I make a static text box to receive the information and I invalidate it whenever I need to update the information. Unfortunately I can't use the WM_INITDIALOG because the user can change the study.
So, I invalidate the static box when I need a change, then validate inside WM_PAINT (which it nicely gives me as a message). Once it is valid, I write on top of the static box with the color and text size which I need. So far, it seems to be doing the job.
Here is the code:
<br />
void CMyToolbar::SetPatInfo(void)<br />
{<br />
int oldColor, bkgColor, oldMode, fontSize = 160;<br />
int i, j;<br />
CFont hFont, *hOldFont;<br />
CBrush br1;<br />
CWnd *wnd1;<br />
CSize sz1, sz2;<br />
CRect rc1;<br />
CString textOut[4];<br />
CDC *pDC;<br />
CCardiacDoc *pDoc;<br />
CCardiacView *vw = CCardiacView::GetView();<br />
pDoc = vw->GetDocument();<br />
textOut[0] = pDoc->m_patName;<br />
if( textOut[0].IsEmpty()) <br />
return;<br />
textOut[1] = pDoc->m_patID;<br />
textOut[2] = pDoc->m_imageData[0].m_acqDateTime.Format("%d-%b-%Y");<br />
textOut[3] = pDoc->m_styName;<br />
if( vw->m_masterFlg <= CCardiacView::VW_CARDIAC_DISP2)<br />
textOut[3] = "Myocardial Perfusion";<br />
<br />
wnd1 = GetDlgItem(IDC_PATINFO);<br />
pDC = wnd1->GetDC();<br />
bkgColor = pDC->GetBkColor();<br />
sz1 = 0;<br />
for( i=j=0; i< 4; i++) {<br />
sz2 = pDC->GetTextExtent(textOut[i]);<br />
if( sz2.cx > sz1.cx) {<br />
sz1 = sz2;<br />
j = i;
}<br />
}<br />
<br />
oldColor = pDC->SetTextColor( RGB(255,0,0));<br />
oldMode = pDC->SetBkMode( TRANSPARENT);<br />
wnd1->GetClientRect(&rc1);<br />
wnd1->ValidateRect(rc1);<br />
sz1.cx = rc1.right;<br />
sz1.cy = rc1.bottom;<br />
br1.CreateSolidBrush(bkgColor);<br />
pDC->FillRect(rc1, &br1);<br />
while( fontSize > 80) {<br />
hFont.CreatePointFont( fontSize, "Ariel", pDC);<br />
hOldFont = pDC->SelectObject( &hFont);<br />
sz2 = pDC->GetTextExtent(textOut[j]);
if( sz2.cx <= sz1.cx) break;
pDC->SelectObject( hOldFont);<br />
DeleteObject( hFont);<br />
hFont.Detach();<br />
fontSize -= 20;
}<br />
for( i=j=0; i<4; i++) {<br />
if( j+sz2.cy > sz1.cy) break;
pDC->TextOut(0,j,textOut[i]);<br />
j += sz2.cy;<br />
}<br />
pDC->SelectObject( hOldFont);<br />
DeleteObject( hFont);<br />
pDC->SetTextColor( oldColor);<br />
pDC->SetBkMode( oldMode);<br />
ReleaseDC(pDC);<br />
}<br />
<br />
void CMyToolbar::OnPaint()<br />
{<br />
CPaintDC dc(this);
SetPatInfo();<br />
}<br />
<br />
void CMyToolbar::Invalidate(void)<br />
{<br />
CWnd *wnd1;<br />
CRect rc1;<br />
wnd1 = GetDlgItem(IDC_PATINFO);<br />
wnd1->GetClientRect(&rc1);<br />
wnd1->InvalidateRect(rc1,0);<br />
}<br />
|
|
|
|
|
You have chosen the harder way, but that's it... your choice.
However, here are some "first look" remarks:
<list> I put SetFont in WM_INITDIALOG message handler only as an example; you can put it also in any oter place, then call Invalidate() as well.
No need to write your own CMyToolbar::Invalidate function, as long as you can directly call Invalidate for the desired control.
GetDlgItem(IDC_PATINFO)->Invalidate();
As long as you have not handled WM_PAINT in the static control, but you draw text in it from another place, for sure you'll have troubles after another window will overlap; just test it and see if I'm right.
Ovidiu
|
|
|
|
|
Again I didn't receive any email to know that you had replied. In fact when I wrote my reply to you, I was convinced that you would never see it since it was so old. I just wrote the reply for the sake of completeness.
Not only were you right, you are ABSOLUTELY right in your analysis that I will have troubles since I don't handle WM_PAINT for the static control. Since I thought there was zero chance of anybody seeing this message, I opened a new message. I described exactly what you said would happen.
If I continue on with what I started then I need to figure out how to handle the WM_PAINT for the static control. So far, I can't find any way to do this. The static control has no messages which I can override. Since you told me that I need to handle this message (very correctly so!!!), could you please tell me how I get my hands onto it?
In parallel I will look into your original solution. Again, I didn't do it by your suggestion because I didn't know you answered so I had to figure out something for myself - and I chose the hard way.
I wasn't really serious about the WM_INITDIALOG, just my reply was "dead" in any case. All I needed was something which I could call more than once and where I could set the font size according to the length of the patient name (or the new patient name for the new study).
Thanks for all your comments. They are VERY helpfull.
Ilan
|
|
|
|
|
I decided that your method was SO much nicer that I would throw out what I did and use your method. Just for general education if you happen to know how I would capture the WM_PAINT for the static control, it would be nice to know. In any case, I will no longer pursue it so it is of minor importance.
I threw out the WM_PAINT message, threw out the invalidateRect and I just call it once. It turns out that I need an initialization routine for setting up the radio buttons depending upon the study type. It was most natural to just call my routine from there (like your WM_INITDIALOG suggestion).
My code is simpler now:
void CMyToolbar::SetPatInfo(void)
{
// font size can start at 16 if 3 lines are permitted.
// start with font size = 12 for 4 lines.
int fontSize = 120;
int i, j;
CFont hFont, *hOldFont;
CWnd *wnd1;
CSize sz1, sz2;
CRect rc1;
CString textOut[4];
CDC *pDC;
CCardiacDoc *pDoc;
CCardiacView *vw = CCardiacView::GetView();
pDoc = vw->GetDocument();
textOut[0] = pDoc->m_patName;
if( textOut[0].IsEmpty()) return;
textOut[1] = pDoc->m_patID;
textOut[2] = pDoc->m_imageData[0].m_acqDateTime.Format("%d-%b-%Y");
textOut[3] = pDoc->m_styName;
if( vw->m_masterFlg <= CCardiacView::VW_CARDIAC_DISP2)
textOut[3] = "Myocardial Perfusion";
wnd1 = GetDlgItem(IDC_PATINFO);
pDC = wnd1->GetDC();
sz1 = 0;
for( i=j=0; i< 4; i++) {
sz2 = pDC->GetTextExtent(textOut[i]);
if( sz2.cx > sz1.cx) {
sz1 = sz2;
j = i; // j will be the maximum string
}
}
wnd1->GetClientRect(&rc1);
wnd1->SetWindowText(textOut[0] + "\r\n" + textOut[1] +
"\r\n" + textOut[2] + "\r\n" + textOut[3]);
sz1.cx = rc1.right;
sz1.cy = rc1.bottom;
while( fontSize > 80) {
hFont.CreatePointFont( fontSize, "Ariel", pDC);
hOldFont = pDC->SelectObject( &hFont);
sz2 = pDC->GetTextExtent(textOut[j]); // the longest one
if( sz2.cx <= sz1.cx) break; // found a size
pDC->SelectObject( hOldFont);
DeleteObject( hFont);
hFont.Detach();
fontSize -= 20; // reduce font size by 2
}
wnd1->SetFont(&hFont);
hFont.Detach();
ReleaseDC(pDC);
}
I have a question about DeleteObject(hFont). Do I need it in my loop if I use hFont.Detach()? I noticed you didn't use it in your example, so I also didn't use it when I found the font I wanted. Will I add garbage if I change the patient to a new patient?
Thanks again,
Ilan
|
|
|
|
|
double (*pf)(int);
double *pf(int);
I don't understand, how are they difference?
|
|
|
|
|