|
Hi.
I would like to know how to determine when the user presses, say, 'z' *while* holding down one of the virtual keys, say Ctrl.
For example
// Ctrl + Z
I can use either OnKeyDown(...) and/or OnChar(...) to determine *either* Ctrl or z, but not both.
I am trying to implement an "undo" feature.
Thanks,
Kuphryn
|
|
|
|
|
|
Thanks.
// if(GetKeyboardState(VK_CONTROL) & 0x8000)
Are you ORing it with the integer 8? Why?
I know that works similarly to check if a key is down while clicking a mouse button. I could not get it to work with a character (OnChar).
Kuphryn
|
|
|
|
|
& is the bitwise AND operator. GetKeyboardState() returns a short (16-bit integer). Check the docs and you'll see that the high bit is 1 if the key is pressed. The high bit of a 16-bit int can be expressed at 0x8000 which is hexadecimal notation.
--Mike--
Rollin' in my 5.0
With the rag-top down so my hair can blow.
My really out-of-date homepage
Sonork - 100.10414 AcidHelm
Big fan of Alyson Hannigan and Jamie Salé.
|
|
|
|
|
Okay. Thanks.
Members at other forums mentioned this functions:
GetKeyState(...);
GetAsyncKeyStat(...);
GetKeyboardState(...); // Your recommendation
What are the differences?
Kuphryn
|
|
|
|
|
Sorry, I mistyped. GetKeyState() is the API I'd use. There's probably no difference that you could see between the three APIs. GetKeyState() returns the state of one key, which is what you want, so that's the best one to use from a code readability standpoint. GetAsyncKeyState() will work as well, it just works differently internally.
--Mike--
Rollin' in my 5.0
With the rag-top down so my hair can blow.
My really out-of-date homepage
Sonork - 100.10414 AcidHelm
Big fan of Alyson Hannigan and Jamie Salé.
|
|
|
|
|
I want one of my resource bitmaps to appear as the background of my dialog window upon runtime. Can someone please let me know how to go about doing this?
Thanks!
|
|
|
|
|
Handle the WM_ERASEBKGND message. The WPARAM will contain an HDC, you should use this value to create a memDC that you can select your bitmap into, then blt the bitmap into the HDC from WPARAM.
Here is an example assuming that you have the bitmap preloaded in hBitmap, and the dimensions of your bitmap have been cached in a BITMAP structure called bm.
HDC hdc = (HDC)wParam;
HDC hdcMem = ::CreateCompatibleDC(hdc);
::SelectObject(hBitmap);
::BitBlt(hdc, 0,0, bm.bmWidht, bm.bmHeight, hdcMem, 0,0,SRCCOPY);
::DeleteDC(hdcMem);
::SetWindowLong(hWnd, DWL_MESGRESULT, TRUE);
return TRUE;
If you have any more questions feel free to ask.
|
|
|
|
|
void CInterceptDlg::OnPaint()
{
PAINTSTRUCT ps;
HDC hdc
hdc = ::BeginPaint(hWnd, &ps);
...
}
If you are using MFC or WTL, then replace hWnd with m_hWnd in order to get access to the HWND member variable for your window.
|
|
|
|
|
dear all,
How can i restrict Multiple Instance of Mfc Dialog based application?
thanks in advance.
|
|
|
|
|
One way is to use a named mutex.
HANDLE hMultiMutex = CreateMutex (NULL, FALSE, "DSSIOmniServerMutex");
if (hMultiMutex == NULL) { }
DWORD dwWaitResult = WaitForSingleObject (hMultiMutex, 0L);
bool fDuplicate = dwWaitResult == WAIT_TIMEOUT;
It isn't 100% fool proof, but it should work for GUIs.
Tim Smith
I know what you're thinking punk, you're thinking did he spell check this document? Well, to tell you the truth I kinda forgot myself in all this excitement. But being this here's CodeProject, the most powerful forums in the world and would blow your head clean off, you've got to ask yourself one question, Do I feel lucky? Well do ya punk?
|
|
|
|
|
hello. i am currently writing a program tictactoe for windows. i got mostly everything working. i got the program to draw the board and draw the X's and O's. the game start by beginning with the player then wait for the computer to move. i got the part where the player clicks on the board and an X is drawn in the grid. i only have to make the computer move but Everything seems to work OK, until last nite when I created a function CheckForMoves which returns an integer and also returns the row and column which is best move. inside the function CheckForMoves, i created a Board then i assigned it to a pointer to Board like this:
CBoard board = *pBoard;
pBoard is the Board i am using to draw my X's and O's for the game. i am copying it to a new board so i can try out all the possible moves in a new board without touching the board i am using in the game. because my board class was implemented dynamically, i wrote my own assignment operator and my own copy constructor. in my assignment operator function, i delete what ever the pointer is point to, then call new then point it to whatever is in the right of the operator. Copy constructor, because it is empty, i just point the pointers to what ever is on the right side. i went along and debugged it using the VC++ debugger then when i was walking through the code i saw that it was calling the Copy constructor. then as i walk over the Copy Constructor everything seems fine. by using asserts, if found out that all the pointers are being copied right. the cells where i store the X's and O's are copied right too. i tried using TRACE statements but i cant find the bug causing the BOARD TO BE EMPTY. i tried using MessageBox before and after calling the copy constructor. as i moved the MessageBox i saw my move X on the Board. but as soon as i clicked the MessageBox that Outputs "After" called after the copy constructor was called. the X in the board disappears. MY CONCLUSION IS THE BOARD I AM USING IN THE GAME IS BEING CHANGED SOMEHOW IN THE COPY CONSTRUCTOR. the copy constructors parameters is like this:
CBoard& CBoard::CBoard(const CBoard& Copy)
I Hope this helps explain my problem. sorry if its very long, i just want to explain it with much detail so i can tell you whats going on. Can anyone tell me whats wrong wid my program and how i can fix it? i would appreciate any method on how to find the bug. Thank you very very much.
John
|
|
|
|
|
John Cruz wrote:
CBoard& CBoard::CBoard(const CBoard& Copy)
I am not sure if this is causing you problems, but this is not what a copy constructor looks like a copy constructor has no return value.
CBoard::CBoard(const CBoard& Copy)
{
...
}
Maybe the compiler is generating the copy constructor for you and that is where your problem is.
|
|
|
|
|
Oh, i am very sorry... i made a mistake in typing my copy constructor... my copy constructor does look like the one u have. here it is and this is whats inside.
CBoard::CBoard(const CBoard& Copy)
{
// Create new objects
mpPen = new CPen;
mpFont = new CFont;
// Set the values to the new values
mpPen = Copy.mpPen;
mpFont = Copy.mpFont;
// Set the values to default for now
mpDefaultPen = NULL;
mpDefaultFont = NULL;
// Sets the rectangle to a certain point, width and height
for (int r = 0; r < MAXROW; r++)
for (int c = 0; c < MAXCOL; c++)
{
mCell[r][c] = Copy.mCell[r][c];
mpGrid[r][c] = new CRect(mLeftTopPt,CSize(mCellWidth,mCellHt));
mpGrid[r][c] = Copy.mpGrid[r][c];
}
}
thank you very much.
|
|
|
|
|
Hello John,
I am not sure what your real problem is and if what I am telling will give you an answer to your solution.
But from your code I draw the conclusion that mpPen are created on the heap.
When you do:
John Cruz wrote:
// Create new objects
mpPen = new CPen;
mpFont = new CFont;
you create two pointers on the heap. Then on
John Cruz wrote:
// Set the values to the new values
mpPen = Copy.mpPen;
mpFont = Copy.mpFont;
you equal the pointers not their values. Futhermore you allocate memory (new CPen) and you do not use it because you assign the pointer to the memory referenced my the source CBoard object (myPen = Copy.mpPen).
When the source copy goes out of scope the destination Pen and destination Font will point to rubbish.
Try *mpPen = *Copy.mpPen; But since these are GDI object you must take into account the handles (HPEN, HFONT), I am not sure, but I think you just cannot copy these objects as the predefined types.
I hope this helps,
Best regards,
Alexandru Savescu
|
|
|
|
|
ok ill try that alexandru.
Thank you very much,
John
|
|
|
|
|
I have tried it but the compiler gave me an error saying operator= not available. Does CPen and CFont have an Assignment operator... here is what i did..
// Create new objects
mpPen = new CPen;
mpFont = new CFont;
// Set the values to the new values
*mpPen = *Copy.mpPen;
*mpFont = *Copy.mpFont;
Thank you very much,
John
|
|
|
|
|
Why are you storing pen/font objects as part of the class anyway - surely they should be variables local to your drawing function?
You could always have CreatePen() and CreateFont() member functions, but better not to use pointers for pen/font objects at all - there's no need, as long as you properly deselect them from the device contexts.
--
Andrew.
|
|
|
|
|
I think now i see that i have a bad program design. my whole tictactoe design is wrong because i only made 3 objects. Board, Player, and Computer. Board handles all the drawing on the board, Player handles all the player moves and stuff. Computer is derived from the Player but it has some additional functions like the Alpha-beta pruning function. IS THERE ANYWAY I CAN FIX MY PROBLEM WITHOUT TRASHING ALL MY CODE. i am sorry, i am still new at this stuff...
Thank you very much,
John
|
|
|
|
|
Heh, please don't take this as if I am being flippant.
Even after nearly 20 years of programming, I still find that many of my initial designs are junk and have to be thrown away. Sometimes in the long run you save more time by starting again with good solid design than trying to patch together a bad design. Then again, if you actually have to maintain the code, it is always best to work from a good solid design.
Tim Smith
I know what you're thinking punk, you're thinking did he spell check this document? Well, to tell you the truth I kinda forgot myself in all this excitement. But being this here's CodeProject, the most powerful forums in the world and would blow your head clean off, you've got to ask yourself one question, Do I feel lucky? Well do ya punk?
|
|
|
|
|
How can I disable my client's menu to appear instead of the default menu
erez@aliroo.com ?
|
|
|
|
|
Hi all,
I tried to show Message when user press CTRL + H in OnChar() !
OnChar function has 3 parameters which first parameter is the KEY ...
I don't know the usage of third parameter ...
Can you write small source ?
Please help me
My month article: Game programming by DirectX by Lan Mader.
Please visit in: www.geocities.com/hadi_rezaie/index.html
Hadi Rezaie
|
|
|
|
|
I always use GetAsyncKeyState to check for control in OnChar.
Christian
The tragedy of cyberspace - that so much can travel so far, and yet mean so little.
"I'm thinking of getting married for companionship and so I have someone to cook and clean." - Martin Marvinski, 6/3/2002
|
|
|
|
|
Thanks for your help
My month article: Game programming by DirectX by Lan Mader.
Please visit in: www.geocities.com/hadi_rezaie/index.html
Hadi Rezaie
|
|
|
|
|
hello. i am trying to write an alpha-beta function called CheckForMove that searches the best move on the board. here is my function...
// Searches for the best computer move on the board
int CComputer::CheckForMoves(int Depth, int Alpha, int Beta, int& Row, int& Col)
{
// Check if the Entered Depth is greater than the Maximum depth
ASSERT(Depth >= MAXDEPTH);
// point the board to a new board
CBoard Board = *mpBoard; <-- here is the problem
// Test for the values for now
Alpha = Beta = 0;
Row = Col = 1;
return 0;
}
when i created a new board and pointed mpBoard which is a Global member function to the Computer class, something is going wrong. so i tried commenting out that and the whole program works. its seems like the problem was on the Copy constructor, because its not copying it correctly i decided to write a new one. it wrote a copy constructor but its still not working write.
// Copy Constructor
CBoard::CBoard(const CBoard& Original)
{
// Copy all the values
Copy(Original);
}
// Copys all the objects
void CBoard::Clone(const CBoard& Copy)
{
// Create new objects
mpPen = new CPen;
mpFont = new CFont;
// Set the values to the new values
mpPen = Copy.mpPen;
mpFont = Copy.mpFont;
// Sets the rectangle to a certain point, width and height
for (int r = 0; r < MAXROW; r++)
for (int c = 0; c < MAXCOL; c++)
{
mCell[r][c] = Copy.mCell[r][c];
mpGrid[r][c] = new CRect( mLeftTopPt,CSize (mCellWidth,mCellHt));
mpGrid[r][c] = Copy.mpGrid[r][c];
}
}
This function compiles correctly. When i use to function CheckforMove it returns the row and column but, its not Drawing the board. i think somehow the mpBoard is getting overwritten because nothing the board is being drawn right. am i missing anything in my Copy Constructor or something. i tried tracing it and putting assert statements but i cant find the bug. can anyone Help me?
|
|
|
|