|
|
If you want this behaviour on more places, you should create a new output stream that accepts strings like your example and internally pauses between outputting each letter. The basic idea is the following:
class StdOutWithPause
{
public:
StdOutWithPause& operator << (const char* pszArg)
{
for( int i = 0; i < strlen(pszArg); i++ )
{ std::cout << pszArg[i]; Sleep(100); }
return *this;
}
};
Behind every great black man...
... is the police. - Conspiracy brother
Blog[^]
|
|
|
|
|
We have a need to change the title bar of our SDI application. I have successfully used the Dundas Ultimate Toolbox 9 COXCaptionPainter and COXCaptionInfo classes to achieve this. I have resolved issues I faced with title bar changing back to Windows style look when the application window loses focus or is partially covered by another window etc. The one problem I am now wrestling with is while displaying modal windows such as the "About box" or "File Open". In these situations, the parent SDI window title goes back to its native Windows style look! Since the parent message loop does not execute when a modal window is displayed, how can I ensure the parent title bar is painted correctly? Any help will be appreciated.
Thanks,
Ganesh
|
|
|
|
|
hiho@ll
what i'm interested in:
zonealarm opens a window if a "unkown" app wants to access the internet and asks if this app is allowed to do this
spybot does the same for the registry. if a app wants change the registry a window is opened to ask the user if this is allowed
btw: i'm not only interested in how do zonealarm and spybot know such stuff (that a app wants to change something), how can zonealarm or spybot can decide if the app is allowed or not? how can zonealarm control what the other apps are allowed to do?
how does such stuff work?
does it work for everything? (control of hardware and every software e.g. check if a specific function of a dll should be called?) is it a hook? if yes, how do they work? (a hint should do it)
thx@ll
-- modified at 14:58 Friday 27th January, 2006
|
|
|
|
|
Not exactly what you want, but I think it will show you how to control process creation system-wide, using hooks. Clickety
"Success is the ability to go from one failure to another with no loss of enthusiasm." - W.Churchill
-- modified at 5:38 Saturday 28th January, 2006
|
|
|
|
|
ThinkingPrometheus wrote: if a app wants change the registry a window is opened to ask the user if this is allowed
btw: i'm not only interested in how do...spybot know such stuff...
RegNotifyChangeKeyValue() is one possibility.
"The greatest good you can do for another is not just to share your riches but to reveal to him his own." - Benjamin Disraeli
|
|
|
|
|
I would think large parts of such programs (ZoneAlarm) would run in ring 0 - essentially a driver. Programs like FileMon and RegMon from SysInternals[^] work like this.
Steve
|
|
|
|
|
thx guys
seems like a lot of work
but i think driver programming is a good hint
|
|
|
|
|
Hello,
I'm developing under Visual Studio 2005. I read that Unicode support has been made the default in Visual Studio 2005. And I can't compile anything.
All usual API functions I use, expect char* pointer. When I pass them a wchar_t* pointer, i get a compiler error.
When I try to cast from wchar_t* to char* I get an error all the same.
Please, can somebody help?
Thanks
-- modified at 14:00 Friday 27th January, 2006
|
|
|
|
|
check the size of the wchar_t value (i.e. check what sizeof(wchar_t) returns. In the past it was the same as an unsigned short. But I have heard that it is now no longer that by default. There should be some setting to turn that back on somewhere in the project C++ settings.
¡El diablo está en mis pantalones! ¡Mire, mire!
Real Mentats use only 100% pure, unfooled around with Sapho Juice(tm)!
SELECT * FROM User WHERE Clue > 0
0 rows returned
Save an Orange - Use the VCF!
|
|
|
|
|
If you're using MFC, a simple way to do it is by using CStringA:
<br />
wchar_t* pBlah = L"blah";<br />
CStringA strAnsi(pBlah);<br />
CallAPI(strAnsi);<br />
If you're not using MFC, there's a handful of ways of doing it. The common Win32 routine is WideCharToMultiByte.
BTW, which APIs are you calling that expect a char*?
"My dog worries about the economy. Alpo is up to 99 cents a can. That's almost seven dollars in dog money" - Wacky humour found in a business magazine
-- modified at 14:49 Friday 27th January, 2006
|
|
|
|
|
Actually I'm using MFC and your trick is very clever.
Thanks for replying.
Cheers,
Allad
|
|
|
|
|
If you're using MFC8, there's a better trick: CW2A() (there's actually a bunch of conversion classes, which you'll find the MSDN help)
|
|
|
|
|
These were introduced with VS 2002 IIRC - they are certainly in VS 2003.
|
|
|
|
|
Robert Edward Caldecott wrote: These
In ATL yes, but not in MFC, IIRC.
|
|
|
|
|
Jack Squirrel wrote: The common Win32 routine is WideCharToMultiByte.
I've read the MSDN page on WideCharToMultibyte. However, I can't figure out how to properly do the conversion. WCharToMutibyte has lots of conversion flags and I'm not very used to code pages and so
on.
Can you please tell me how to convert a simple wide char string pointer to usual one byte char pointer?
Thanks,
Allad
|
|
|
|
|
Sounds like the easy out would be to simply change to an ANSI build.
Steve
|
|
|
|
|
Stephen Hewitt wrote: Sounds like the easy out would be to simply change to an ANSI build.
I've tried but I don't know which option to enable under the project settings in VC++ 2005.
Can you help?
|
|
|
|
|
I use MSVC6. He's how I do it:
1. Select "Project->Settings...".
2. Select "C/C++" tab.
3. In the "Category" combo select "General".
4. In the "Preprocessor definitions" edit remove "UNICODE" and "_UNICODE" and add "_MBCS".
Hopefully you can adapt these steps to 2005.
Steve
|
|
|
|
|
Thanks for your post.
However, I'd like to enable support for ANSI rather than Mutibyte characters.
Which compiler flag should I use instead of "_MBCS"?
Cheers,
Allad
|
|
|
|
|
You can take out the "_MBCS" - But in windows when people say ANSI they really mean define "_MBCS". The previous version (MSVC6) would have had "_MBCS" defined. Check this[^] out. In short you should have "_MBCS" defined.
Steve
|
|
|
|
|
Like a puzzle game, how can I swap the 'hole' with the 'target element'? I use 'switch' and 'pointer' but failed!! Pls advise!!
//Moving the hole.
void Move(int& holeidx,int move)
{
int tar_row; //The row of the target element
int tar_col; //The column of the target element
int hrow; //The row of the hole
int hcol; //The column of the hole
int temp=0; //A temporary variable for swapping
int number; //The index number of the target element
hrow = holeidx / size; //Calculate the row number of the hole
hcol = holeidx % size; //Calculate the column number of the hole
int* phole = 0; //The pointer of the hole
switch(move)
{
case 49: //(Press 1)
phole = &holeidx;
tar_row = ++hrow;
tar_col = --hcol;
break;
case 50: //(Press 2)
phole = &holeidx;
tar_row = ++hrow;
tar_col = hcol;
break;
case 51: //(Press 3)
phole = &holeidx;
tar_row = ++hrow;
tar_col = ++hcol;
break;
case 52: //(Press 4)
phole = &holeidx;
tar_row = hrow;
tar_col = --hcol;
break;
case 53: //(Press 5)
phole = &holeidx;
tar_row = hrow;
tar_col = hcol;
break;
case 54: //(Press 6)
phole = &holeidx;
tar_row = hrow;
tar_col = ++hcol;
break;
case 55: //(Press 7)
phole = &holeidx;
tar_row = --hrow;
tar_col = --hcol;
break;
case 56: //(Press 8)
phole = &holeidx;
tar_row = --hrow;
tar_col = hcol;
break;
case 57: //(Press 9)
phole = &holeidx;
tar_row = --hrow;
tar_col = ++hcol;
break;
case 113: //(Press q)
case 81: //(Press Q)
exit(1); //If Press Q to quit, exit the game directly.
break;
default:
break;
}
|
|
|
|
|
I'm not sure what you're doing with phole , but it's being assigned the same value in every case of the switch statement. This is inefficient. Most of all, though, you don't need phole at all.
In addition, you don't need tar_row and tar_col either. Your switch statement can simply increment or decrement hrow and/or hcol directly. When you're finished, just convert these values back into holeidx .
You can stop here. This will solve your problem. Also...
You can remove the switch statement altogether and use a lookup table. Translate the '1' through '9' values into an index into this table. Table entries would be simple structs holding the modification to the row and column variables. You only need special traps for the 'q' key.
This table could be simplified even further by storing the modifier to holeidx . But this table would have to be built at run-time, since the value of size isn't known until then.
Bob Ciora
-- modified at 18:04 Friday 27th January, 2006
|
|
|
|
|
I used to use a manifest file in the resources. But now with vc8, for the same app, I want it to get autogenerated (just like when you create a new project). Where's the setting that enables themes in the app and gets the right manifest to get generated? Please help...
Thanks!
swine
[b]yte your digital photos with [ae]phid [p]hotokeeper - www.aephid.com.
|
|
|
|
|
I had the same trouble migrating from vc71. The first thing you need to do is remove your old manifest file from the resources.
Secondly, you need to add a small snippet of code to your vc6 project that exists in new vc8 projects, but is missing from migrated projects.
Create a new vc8 mfc project - at the bottom of the stdafx.h file, you'll see something like this:
<br />
...<br />
#ifdef _UNICODE<br />
<br />
...<br />
<br />
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")<br />
<br />
...<br />
<br />
#endif<br />
Copy the entire #ifdef block to the stdafx.h file of your old project and it should remedy the problem.
"My dog worries about the economy. Alpo is up to 99 cents a can. That's almost seven dollars in dog money" - Wacky humour found in a business magazine
|
|
|
|