|
Hi, all
How do you create a window with a close/exit button (X) but no titlebar/caption icon in the upper-left corner of the window? I have tried to set the window class members ".hIcon" and ".hIconSm" to null but that only changes the icon into a windows default icon. And I have tried to remove the "WS_SYSMENU" flag but also removes the Close button. I know that this is fully possible, just look at the about window in VC++. Are there some specific flags you have to add when creating the windows or registering the window class? Please help
Aidman » over and out
|
|
|
|
|
you must set both small and big icon to NULL, and it must be done before the icons are
set from somewhere else (if icons are already set, then setting them to NULL will be
ignored).
example:
in MFC dialog based app, inside OnInitDialog() there are 2 calls to SetIcon(m_hIcon,...),
for both icons. If you replace m_hIcon with NULL , you will get the wanted behavior
if not in an MFC app, you can send WM_SETICON msg to the window
hth
|
|
|
|
|
I am not using MFC app.
Zed wrote:
you must set both small and big icon to NULL, and it must be done before the icons are
set from somewhere else
What do you mean? Is there any place else to set icon before the window class?
Zed wrote:
if not in an MFC app, you can send WM_SETICON msg to the window
I tried that, but nothing happens. I pressume that this function is used only for windows that you do not own.
Aidman » over and out
|
|
|
|
|
Hope some one can help me out here. What is the simplest way to display a bitmap in your client area? For example if I have created a bitmap with the resource editor eg IDB_BITMAP. How would I bitblt this to my client area?
Thanks in advance,
Paddy
|
|
|
|
|
Let say you have bitmap CBitmap m_bitmap;
1) Create temporary DC
2) Select new bitmap into it
3) BitBlt from temp into controlDC
OnPaint
{
CDC dc( this);
CDC tempDC;
if (tempDC.CreateCompatibleDC(&dc))
{
if (m_bitmap.GetSafeHandle())
{
CBitmap* pOldBM = tempDC.SelectObject(&m_bitmap);
BITMAP BM;
m_bitmap.GetBitmap(&BM);
dc.BitBlt(0, 0, BM.bmWidth, BM.bmHeight, &tempDC, 0, 0, SRCCOPY);
tempDC.SelectObject(pOldBM);
}
}
|
|
|
|
|
Thanks for the help Brian. I forgot to mention I'm not using MFC but I presume you use the same process anyway?
1) Create temporary DC
2) Select new bitmap into it
3) BitBlt from temp into controlDC
Or is it different do you know?
Paddy
|
|
|
|
|
HDC hTempDC, hClientDC;
HBITMAP hBmp = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1)),
oldBmp;
hTempDC = CreateCompatibleDC(NULL);
oldBmp = (HBITMAP)SelectObject(hTempDC, hBmp);
hClientDC = ::GetDC(hClientWnd);
BITMAP BM;
GetObject(hBmp, sizeof(BITMAP), &BM);
BitBlt(hClientDC, 0, 0, BM.bmWidth, BM.bmHeight, hTempDC, 0, 0, SRCCOPY);
ReleaseDC(hClientWnd, hClientDC);
SelectObject(hTempDC, oldBmp);
DeleteObject(hBmp);
DeleteDC(hTempDC);
|
|
|
|
|
Excellent, thanks.
Paddy.
|
|
|
|
|
Microsoft used to have a prog (aclist.exe) that would list all the ActiveX controls on the machine it was on. Does anyone know if there is something similar that will work on my Win XP machine OR is there a feature in Visual Studio.Net that will do it. I would like to have a list of all the built-in ActiveX controls on my computer along with their class id's
"It has become appallingly obvious that our technology has exceeded our humanity."
- Albert Einstein (1879-1955)
"I think there is a world market for maybe five computers."
- Thomas Watson (1874-1956), Chairman of IBM, 1943
"640K ought to be enough for anybody."
- Bill Gates (1955-), in 1981
"Half this game is ninety percent mental."
- Yogi Berra
|
|
|
|
|
Ole-Com object Viewer?
Or just write your own: 20 - 30 lines.
Just enum registry HKClassesRoot\CLSID....
Brian
|
|
|
|
|
VC++ 6.0/SP5
Win2K
I'm writing an dialog-based app with the following criteria:
1) The app spawns from 1 to n threads. These threads are responsible for calling ::CreateProcess to start a given external app after a certain pre-determined interval of time.
2) Each thread periodically reports back to the app's main window (the dialog box) by calling PostMessage(wParam, lParam) - this is the MFC version of PostMessage, therefore fewer parameters are required.
3) lParam is not used, but wParam is a pointer to a class that contains data necessary for the dialog box to act on the message, and is local to the thread. It is manipulated like so:
class CThreadStatus
{
};
class CMyThread
{
private:
CThreadStatus m_threadStatus;
void PostHostMessage(int nMsg, int nSubMsg);
};
void CHostThread::PostHostMsg(int nMsg, int nSubMsg)
{
m_ThreadStatus.Reset();
m_ThreadStatus.m_nMessage = nMsg;
m_ThreadStatus.m_nSubMessage = nSubMsg;
m_ThreadStatus.m_nHostID = m_nHostID;
m_ThreadStatus.m_nRaceNumber = m_nCurrentRace;
m_pOwner->PostMessage(UWM_LAUNCHERMSG, WPARAM(&m_ThreadStatus), 0);
}
3) The dialog box processes the data in the dialog box after casting the wParam to a CThreadStatus*, domething like this:
LRESULT CDlg::OnLauncherMsg(WPARAM wParam, LPARAM, lParam)
{
lParam;
LRESULT lResult = 1L;
CThreadStatus* threadStatus = (CThreadStatus*)wParam;
int nMsg = threadStatus->m_nMessage;
switch (nMsg)
{
case MSG_SCHED :
HandleSche dMsg(threadStatus);
break;
case MSG_SIM :
HandleSimMsg(threadStatus);
break;
case MSG_DEMONS :
HandleDemonsMsg(threadStatus);
break;
}
return lResult;
}
---------------------
Statements:
1) I've tested this code with up to four threads all hitting the same marks at the same time, and pretty much pummelling the code with simulateous message posts (one at a time from each thread at pretty much the same time) for almost 6 hours straight. On my P4/1.6 machine (and a laptop to boot), the code works flawlessly.
2) I have a user that continually reports problems that don't appear to directly connected with my app, but I figured I'd ask around since my app is so heavily dependant on multiple threads.
---------------------
Question:
Does it appear to anyone here as if the threads could be banging on each other at the point the dialog box tries to handle the messages being passed?
The app does not appear to hang, but for some reason, it thinks an error happened with the app I'm running through ::CreateProcess (specifically, the external app does not appear to ever enter it's Idle Input Loop), and it stops processing that thread. It handles the error gracefully 9reporting the status in the parent dialog's list control, but this also has the effect of shutting down the thread.
For the record, the following apps are also running on the user's machine:
Norton Anti Virus
Freeserve FTP server
Black Ice Firewall software
VNC
PC-Anywhere
I told him that it could be that the NAV or firewall software is somehow interfering with my program and or the external app my software is running. His response was predictable - "Well, the last version of of your software and the external app worked fine in this configuration, so it should work equally well with the new version, right?"
Does anyone have any suggestions, comments, or criticisms?
------- signature starts
"...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
Please review the Legal Disclaimer in my bio.
------- signature ends
|
|
|
|
|
John Simmons / outlaw programmer wrote:
Does it appear to anyone here as if the threads could be banging on each other at the point the dialog box tries to handle the messages being passed?
Since you're using PostMessage to communicate with the dialog box, the messages are processed serially. In other words, the threads may be posting messages simultaneously, but they're each processed one at a time by the dialog's message queue. You can verify this by putting TRACE messages at the beginning and end of OnLauncherMsg.
John Simmons / outlaw programmer wrote:
The app does not appear to hang, but for some reason, it thinks an error happened with the app I'm running through ::CreateProcess (specifically, the external app does not appear to ever enter it's Idle Input Loop), and it stops processing that thread. It handles the error gracefully 9reporting the status in the parent dialog's list control, but this also has the effect of shutting down the thread.
That sounds strange. Why does it terminate the thread? Is an exception being thrown somewhere?
Regards,
Alvaro
There are no stupid questions, but there are a lot of inquisitive idiots. -- despair.com
|
|
|
|
|
Alvaro Mendez wrote:
That sounds strange. Why does it terminate the thread? Is an exception being thrown somewhere?
The thread terminates itself because it perceives a problemn with the external app being executed (the external app never appears to reach it's input idle loop).
Like I said, the error is handled in a controlled manner, but the external app appears to be freaking my program out.
------- signature starts
"...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
Please review the Legal Disclaimer in my bio.
------- signature ends
|
|
|
|
|
NAV does not do anything until a thread attempts file access. The only interaction your app will have with NAV is when a thread launches an app. NAV will scan that app before allowing it to run.
What kind of error are you getting? Error from CreateProcess() ? Or do you have a timeout waiting for the new app to go idle and the time is expiring? If it's the latter case, the external app could, I suppose, make NAV's heuristics chug away for a couple of seconds if it happens to look like a potential virus. First thing to try is rule out NAV - add an exclusion for the EXE that gets run (or EXEs, if there are several) so they won't be scanned by NAV.
--Mike--
PROCRASTINATION: Hard work often pays off after time, but laziness always pays off now.
BUY MY SOFTWARE!! (please?) RightClick-Encrypt | 1ClickPicGrabber
My IntarWeb Homepgae!!!11
|
|
|
|
|
I sent the guy an email suggesting that he exclude the external app and my program (and it's data files) from the scan to see if that helps.
------- signature starts
"...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
Please review the Legal Disclaimer in my bio.
------- signature ends
|
|
|
|
|
Maybe it is not the hit, but if you do messaging between Threads: PostThreadMessage, ON_THREAD_MESSAGE.
And my experience that creating a thread can last little while (a few seconds), because the startup is delayed (chached???).
Try this @ home. (B&B)
|
|
|
|
|
You are using WaitForInputIdle to determine when launched
app is finished initializing? I don't see in the docs much
explicit on what the conditions are for this.
So I am guessing that the kernel signals an internal event
or flag when a PeekMessage or GetMessage is called
w/o any messages in the queue. (a guess based on what
constitutes "idle time", never did find good desc. of
what this condition is exactly. Maybe it even polls the
queues while scheduling and flags then?)
Could the problematic app be a console app, or perhaps it
posseses a state where the message queue is never empty?
Can the process handle become signalled before the
"idle time" signals? (maybe it fails or transfers to
another instance?)
So maybe you need to wait with a timeout for input idle
and check the process handle with 0 timeout to see if the
launched app has ended before attending to its message queue.
Just some ideas..
|
|
|
|
|
I've seen some sample code for a ListCtrl TitleTip class here and on codeguru.com. This class will display the full text in a listctrl column when the mouse is hovered over it, in the case that the text is too wide for the column.
However, when implementing the code from codeguru.com, it will not pass any accelerator keys while the tip is being displayed. I've e-mailed the author of the class here on CodeProject.com, and have not received an answer. His code is based on the original code from codeguru.
Just wondering if anyone has a class that will do this and still support keyboard accelerators.
Thanks!
|
|
|
|
|
I have a little problem with the embedded Visual C++ Studio , but I think that's a general problem with the Visual C++ Studio and that's the reason why I am posting this message hear and not in the Embedded/Mobile forum.
So... I have some source code which I use in my Pocket PC application and my Desktop PC application.
I use the following #define so that I can compile it with eVC++ and Visual Studio .NET 2003 :
<br />
#if defined(UNDER_CE) // for Pocket PC application<br />
#pragma message("## Pocket PC ##")<br />
#else // for Desktop PC application<br />
#pragma message("## Desktop PC ##")<br />
#include <rapi.h><br />
#endif<br />
In my Visual C++ .NET 2003 application there is no problem, but in my Pocket PC application I get the following warning:
<br />
Compiling...<br />
MeasureFileList.cpp<br />
## Pocket PC ##<br />
Linking...<br />
D:\windows ce tools\wce300\Pocket PC 2002\include\rapi.h(438): Could not find the file prapi.h.<br />
D:\windows ce tools\wce300\Pocket PC 2002\include\ceapimap.h(197): Could not find the file pceapimp.h.<br />
<br />
LmsPPC.exe - 0 error(s), 0 warning(s)<br />
Downloading files<br />
Failed downloading.<br />
It looks like that eVC++ would include the rapi.h file! But the include command are not in the #if defined(UNDER_CE) section, it's in the #else section.
What's wrong?
Daniel
---------------------------
Never change a running system!
|
|
|
|
|
it is looking for prapi.h, not rapi.h
Sonork 100.11743 Chicken Little
"You're obviously a superstar." - Christian Graus about me - 12 Feb '03
Within you lies the power for good - Use it!
|
|
|
|
|
Yes... and this command is in the rapi.h file:
<br />
...<br />
#include <ceapimap.h><br />
<br />
#ifdef CONN_INTERNAL<br />
#include <prapi.h> <br />
#endif<br />
<br />
#endif // #ifndef RAPI_H<br />
...<br />
It looks like the eVC++ includes the rapi.h (because eVC++ found it!) but can't find the prapi.h file!
Daniel
---------------------------
Never change a running system!
|
|
|
|
|
Ok, fair enough.
Are you sure the rapi.h file is not being included by another file. try commenting out the #include line and see what happens then. If it still complains then that line is not your problem.
HTH
Sonork 100.11743 Chicken Little
"You're obviously a superstar." - Christian Graus about me - 12 Feb '03
Within you lies the power for good - Use it!
|
|
|
|
|
Darn, sometimes something that should be easy gets
complicated. I have a modeless dialog that send
messages to its parent window. These are WM_COMMAND
messages for BN_CLICKED, BN_PUSHED, and BN_UNPUSHED.
e.g.
GetParent()->SendMessage(WM_COMMAND,(WPARAM)(BN_PUSHED<<16|nID),0);
To the parent window's message map I have added the
entries:
ON_CONTROL_RANGE(BN_CLICKED,ID_0,ID_N,OnClickX)
ON_CONTROL_RANGE(BN_PUSHED,ID_0,ID_N,OnPushedX)
ON_CONTROL_RANGE(BN_UNPUSHED,ID_0,ID_N,OnUnpushedX)
However, OnClickX is called to for BN_CLICKED, BN_PUSHED,
and BN_UNPUSHED.
I walked through with the debugger and the correct message
is sent (WM_COMMAND with BN_CLICKED, BN_PUSHED, or BN_CLICKED)
but the wrong handler is invoked. (I stopped short of
trying to walk through the CCmdTarget's use of the
message map (that is some seriously ugly code to walk
through.) in the hope that someone will have some knowledge
here.
Am I doing something wrong? missing something here?
I tried changing the order of the message
map entries in case there was a problem
|
|
|
|
|
Ah, I found the problem.
If I didn't pass the button's window handle in the lParam,
then the CWnd's OnCommand handler, zeros the nCode
parameter, effectively making everything into a BN_CLICKED.
So I need to do:
GetParent()->SendMessage(WM_COMMAND,(WPARAM)(BN_PUSHED<<16|nID),hBtn);
Should I have known that?
(i.e. what purpose does that zeroing serve in OnCommand?)
|
|
|
|
|
Hi!
I have 3 Apps in my project. I would like to create a dialog with 3 buttons so that if I click on the first button the first app is launched. If I click on the second button, the second app is launched...
How can I do this?
thanks for helping..
Regards
Everything's beautiful if you look at it long enough...
|
|
|
|
|