|
Thanks a lot. I'll experiment with that tonight.
Volodya Orlenko,
orlenko [at] hotmail [dot] com
|
|
|
|
|
Hello everybody!
How can I print multi-rows text with format as a CDC::DrawText() functions?
Best regards,
Eugene Pustovoyt
Sonork ID 100.10002:Yaumen
|
|
|
|
|
Use GDI+ (graphics.DrawString).
|
|
|
|
|
Why not use DT_WORDBREAK style?
From MSDN:
DT_WORDBREAK Specifies word-breaking. Lines are automatically broken between words if a word would extend past the edge of the rectangle specified by lpRect. A carriage return–linefeed sequence will also break the line.
------------------------
Derek Waters
derek@lj-oz.com
|
|
|
|
|
Thank you!
But DrawText with multi-rows not allows the vertical align!
Best regards,
Eugene Pustovoyt
Sonork ID 100.10002:Yaumen
|
|
|
|
|
Nope, if you need to vertical align, you'll have to do it in two steps:
CRect vtCenterInRect(0, 0, 300, 200);
CString vcstrLabel(_T("We want to wrap this text in the rectangle"));
pDC->DrawText(vcstrLabel, vtCenterInRect, DT_CALCRECT | DT_WORDBREAK | DT_TOP);
CRect vtActualRect;
vtActualRect.left = 0;
vtActualRect.right = 300;
vtActualRect.top = (200 - vtCenterInRect.Height()) / 2;
vtActualRect.bottom = vtActualRect.top + vtCenterInRect.Height();
pDC->DrawText(vcstrLabel, vtActualRect, DT_WORDBREAK | DT_TOP);
Hope this helps.
------------------------
Derek Waters
derek@lj-oz.com
|
|
|
|
|
Well, it's fine work!
Thank you very much.
Best regards,
Eugene Pustovoyt
Sonork ID 100.10002:Yaumen
|
|
|
|
|
where can I find some articles about the "Thread Pool"?
|
|
|
|
|
The ultimate framework for thread programming is Douglas Schmidt's ACE library, which, among an impressive array of features, provides a thread pool.
Anyway, ACE can probably be an overkill if you're planning to do a simple program. Sherwood Hu's A programming model to use a thread pool could be a simpler alternative.
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
Hi guys,
I'm doing a ::PostMessage() to a window via a worker thread. The documentation for ::PostMessage() says that if the post succeeds, then the return value is nonzero. However, sometimes I get a zero result, and then I check the GetLastError() and this returns 0 as well (I'm assuming this means "no error", as the docs say nothing about this). I know the window handle I'm posting to is valid. What is going on?
Thanx
swinefeaster
Check out Aephid Photokeeper, the powerful digital
photo album solution at www.aephid.com.
|
|
|
|
|
Post some code here, then it's much easier to tell you whats wrong!
Or try ::SendMessage(..) instead
------------------------------
©0d3 ©®4©k3® - That's me!
------------------------------
|
|
|
|
|
Not much else to say but what I said in the previous post. I'm posting a custom message to a window that I know exists. Also, SendMessage() just won't do, as the message needs to be sent from a worker thread to the main gui thread.
cheers,
swinefeaster
Check out Aephid Photokeeper, the powerful digital
photo album solution at www.aephid.com.
|
|
|
|
|
Have you tried:
BOOL PostThreadMessage(
DWORD idThread, // thread identifier
UINT Msg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
------------------------------
©0d3 ©®4©k3® - That's me!
------------------------------
|
|
|
|
|
and try this to:
DWORD GetWindowThreadProcessId(
HWND hWnd, // [in] handle to window
LPDWORD lpdwProcessId // [out] process identifier
);
------------------------------
©0d3 ©®4©k3® - That's me!
------------------------------
|
|
|
|
|
Hmmm interesting . I didn't know about this api function. I'm going to try this.
Is there any easy way of getting the main ui thread? (instead of just retrieving it by the ui thread on startup and using ugly synchronization to get it in the worker thread)
What do I pass as the time? I'm assuming this is the value returned by GetTickCount(). The docs for MSG say nothing about the format of this field.
But shouldn't PostMessage() be thread safe anyways? It works for other messages... Oh btw the exact same code I mentioned in the original post does work sometimes.
Thanks!
swinefeaster
Check out Aephid Photokeeper, the powerful digital
photo album solution at www.aephid.com.
|
|
|
|
|
swinefeaster wrote:
What do I pass as the time? I'm assuming this is the value returned by GetTickCount(). The docs for MSG say nothing about the format of this field.
Pass where? :/
-------------------------------------------
And if you use the HWND that you created in the main thread you should get the main thread ID if you do lika this:
GetWindowThreadProcessId(hWnd, lpdwProcessId); // hWnd is the HWND that you created in the main thread. lpdwProcessId is the thread ID of the main process
After that do just:
PostThreadMessage(lpdwProcessId, WM_COMMAND, (WPARAM)ID_OK, 0); // Send a WM_COMMAND to the main thread.
I hope this work!!
------------------------------
©0d3 ©®4©k3® - That's me!
------------------------------
|
|
|
|
|
Oops I read the documentation wrong. I thought I was supposed to pass a MSG structure in the call to PostThreadMessage().
Anyways, I just tried using that call and I get the exact same result: PostThreadMessage() returns 0 and GetLastError() returns 0 as well.
What the hell is going on?
swinefeaster
Check out Aephid Photokeeper, the powerful digital
photo album solution at www.aephid.com.
|
|
|
|
|
GetLastError() Return values:
Code Description Name
-----------------------------------------------------------------------
0 The operation completed successfully. ERROR_SUCCESS
-----------------------------------------------------------------------
Well, as you see this is an return value from GetLastError that 0 is ERROR_SUCCESS and it means that there is no error... hm.. strange!
I don't remember, but did your message that you sent do any effect or so?
If not, there must be another error somewhere in the code or something... send me the code to my mail box or here if it's not so much! I'm sure I can give you more help if you do that!
------------------------------
©0d3 ©®4©k3® - That's me!
------------------------------
|
|
|
|
|
Just for laughs I'll post the code that did this:
bool posted = ::PostMessage(handle, message, wParam, lParam);
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if(!posted)
{
DWORD error = GetLastError();
CWinApp* WinApp = AfxGetApp();
cSubMainApp* App = safe_dynamic_cast<csubmainapp*>(WinApp);
if(!App)
{
// Couldn't cast app.
ASSERT(false);
}
else
{
DWORD mainThreadId = App->GetMainUiThreadId();
posted = PostThreadMessage(mainThreadId, message, wParam,
lParam);
error = GetLastError();
}
}
Note that here I'm trying both api functions.
swinfeaster
Check out Aephid Photokeeper, the powerful digital
photo album solution at www.aephid.com.
|
|
|
|
|
swinefeaster wrote:
GetMainUiThreadId();
I don't recognize this method?
-----------------------------------------------
Tell me what message you're trying to send!
------------------------------
©0d3 ©®4©k3® - That's me!
------------------------------
|
|
|
|
|
Got your mail buddy!
------------------------------
©0d3 ©®4©k3® - That's me!
------------------------------
|
|
|
|
|
Do you know if the window actually receives the message?
|
|
|
|
|
He say that the code works sometimes... so it should! :/
------------------------------
©0d3 ©®4©k3® - That's me!
------------------------------
|
|
|
|
|
Two quick questions... [1] What is the *value* (WM_APP + 1, WM_USER + 1, etc.) of the message you are sending, and [2] what are you sending as the WPARAM and LPARAM parameters?
Peace!
-=- James.
|
|
|
|
|
Hey James,
Ok, so WM_USER is defined as:
#define WM_USER 0x0400
which is 1024 in decimal...
The id of the message I'm sending is 1385, so WM_USER + 361.
The WPARAM and LPARAM are both sent as 0, as I don't use them in this message.
Weird....
Cheers,
swinefeaster
Check out Aephid Photokeeper, the powerful digital
photo album solution at www.aephid.com.
|
|
|
|