|
Hello,
I have a subclass from CDialogBar. I try tu put a IP control in it, but i can´t get the bytes in that control.
I see that happens not only with this control, it happens with any control that don´t be a edit...
What happens?
Thanks Codeprojects...
UI
|
|
|
|
|
Can you post some code? I've used CDialogBars quite a bit, and have never experienced the problems you are talking about.
------------------------
Derek Waters
derek@lj-oz.com
|
|
|
|
|
Hi everyone. I have some code which centers a series of buttons on a dialog, which is in OnSize(). Problem I have is, as the user resizes the control, the buttons are drawn twice (?), and there are "artifacts" of the original draw are still there. If the window is minimized and brought back up again, the buttons draw properly and the "artifacts" are gone. The buttons do center and adjust properly as the window is resized, but leave those "artifacts" for some reason. It doesn't happen when the window is maximized and normalized, but do occur when the user drags the window frame and resizes that way.
I am also using Paul Wendt's CControlPos class which is found on Codeproject, which moves all the other controls (I had to move the buttons manually to achieve the centering with a series of buttons).
Anyone have any ideas? Any help is greatly appreciated!
<br />
void CDlgMain::OnSize(UINT nType, int cx, int cy) <br />
{<br />
CDialog::OnSize(nType, cx, cy);<br />
<br />
CRect rcButtonRect;<br />
<br />
if(::IsWindow(GetDlgItem(IDC_BTN_ADD)->GetSafeHwnd()))<br />
{<br />
<br />
bool bDrawAgain = true;<br />
<br />
GetDlgItem(IDC_BTN_ADD)->MoveWindow(rcButtonRect, bDrawAgain);<br />
<br />
rcButtonRect.left = ((cx - iParentWidth)/2) + iButtonLeft;<br />
rcButtonRect.right = rcButtonRect.left + iButtonWidth;<br />
GetDlgItem(IDC_BTN_EDIT)->MoveWindow(rcButtonRect, bDrawAgain);<br />
<br />
rcButtonRect.left = ((cx - iParentWidth)/2) + iButtonLeft;<br />
rcButtonRect.right = rcButtonRect.left + iButtonWidth;<br />
GetDlgItem(IDC_BTN_DELETE)->MoveWindow(rcButtonRect, bDrawAgain);<br />
<br />
iButtonLeft = 391;<br />
rcButtonRect.left = ((cx - iParentWidth)/2) + iButtonLeft;<br />
rcButtonRect.right = rcButtonRect.left + iButtonWidth;<br />
GetDlgItem(IDC_BTN_COPY)->MoveWindow(rcButtonRect, bDrawAgain);<br />
}<br />
<br />
m_cControlPos.MoveControls();<br />
}<br />
|
|
|
|
|
Is WS_CLIPCHILDREN set for the dialog?
Maybe calling CDialog::OnSize(nType, cx, cy); after moving the controls would work.
farewell goodnight last one out turn out the lights Smashing Pumpkins, Tales of a Scorched Earth
|
|
|
|
|
I tried doing both, with no luck It still leaves junk behind when the user drags on the window frame
|
|
|
|
|
well, you could also pass in FALSE to all the MoveWindow() calls, then follow everything with Invalidate(TRUE) . It'll flicker a bit, but should look ok.
farewell goodnight last one out turn out the lights Smashing Pumpkins, Tales of a Scorched Earth
|
|
|
|
|
I've also seen this problem when resizing static picture controls (eg: frame borders). Try invalidating and updating the dialog at the end of the repositioning.
void CDlgMain::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
....
Invalidate();
UpdateWindow();
} /ravi
"There is always one more bug..."
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
That worked great! Thanks for the help!
|
|
|
|
|
i am trying to write a tictactoe game in VC++ but i dont know how to organize it and whats the best way to do it. i am planing to use Bitmap graphics and beneath it use a grid to find out which one the user clicks. and i am planing to use recursion to implement it but i dont know if thats the efficient way to do it. can anyone help me. i am not good in designing? can someone give me an advice on whats the best way to do it?
|
|
|
|
|
This is your homework, isn't it.
Here's what i'd do to get started:
use the VS wizards to create a dialog based app. Delete all controls from the dialog. Implement an OnPaint() handler that draws your board. Handle mouse messages to respond to player actions. Use a separate class to implement game logic.
There are many ways to implement a tic-tak-toe game; just use whatever makes the most sense to you. If you have a specific question, i'm sure you'll get plenty of answers to it.
Have Fun!
farewell goodnight last one out turn out the lights Smashing Pumpkins, Tales of a Scorched Earth
|
|
|
|
|
I did this for my Gr. 12 comp sci course last year, but in VB...
It is your homework...
In anycase. This is what I did.
1) Create a dialog
2) Create (an array or not) of 9 Pushbutton controls and set the font accordingly, I used Arial Bold 23 Pts. This will let you focus on game logic, instead of x and o drawing.
3) Last create an array of 9 chars, NULL=Empty, X is X, Y is Y. This array will map to your physical buttons. this way you can disable the button once it was clicked and avoid having to double check the array to ensure someone hasn't chosen the same location twice.
4) On each buttonclick set the coresponding array element to X or Y depending on whos turn it is, then change the current buttons caption to the current elements value.
5) Design a killer AI, that of which will rival a Russian chess champion.
Tips: It'll be much easier to create the buttons statically and position them with dialog editor.
Tips: Each button click do the following!
1) Iterate array looking for X or O's horizontally
2) Iterate array looking for X or O's vertically
3) Iterate array looking for X or O's diagonally
If your test function returns TRUE you know someone has won the game!
BOOL IsWin()...???
your choice...from here on your on yer own...
Cheers!
"An expert is someone who has made all the mistakes in his or her field" - Niels Bohr
|
|
|
|
|
Yah, i made my design using MFC. i used the CDC function moveto and line to draw the board. beneath it i made an array of Crect so i would know which one i clicked. if i click a point inside a rectangle an X will be draw using the textout function. pretty much, i got all the designing done, my only problem now is creating the AI for my tictactoe. i am thinking of using recursion to implement that. i dont know if that is efficient or just make a list of moves instead. is using recursion better? honestly this is not my homework. in school where learning assembly but i thought id practice MFC and C++.
|
|
|
|
|
You're learning assembly in school ? Cool.
The most interesting and effective way I can think of would be to program the computer to play itself and remember moves that lead to a win, as well as obviously searching for the ability to finish a row. That way it will teach itself.
Sorry, I really have only vague ideas about how to do this.
Christian
I have come to clean zee pooollll. - Michael Martin Dec 30, 2001
Picture the daffodil. And while you do that, I'll be over here going through your stuff.
|
|
|
|
|
A tic-tac-toe AI alogorithm is quite similar to a Chess AI except much simpler. There are numerous ways to implement it, and recursion is certainly an escellent bet IMHO.
Work around a frameowrk similar to this;
For each player move:
1. Determine possible computer moves
2. For each computer move, guess the player move. Let the computer mentally play the game until a given recursion limit (e.g. 6 moves) is reached.
3. For each series, return a score for that path of play.
4. Collate the data, and the highest scoring move-set wins, and the move is made.
Optimisations can be made, such as after the move tree has been compiled, if the player makes the predicted move, just chop off the inappropriate branches and iterate another level. This is quite a complex optimisation if you are only starting out, but will probably be worthwhile if you want to go that far.
Remember, if the board is empty, and you are playing on a 3x3 grid, there are 3x3 possible moves, i.e. 9 moves. However, once the computer has moved (presuming the computer were to take first play), there will be eight remaining moves for the player. Bearing in mind that the computer will have to guess the player's moves as well as it's own, that means that, if you take to recusion to 6 levels, there are 9P6 possible moves, (i.e. 9x8x7x6x5x4 moves). For a full game, there would be 9! possible moves, i.e. 362,880 possible moves, so you probably wouldn't want to guess out the entire game.
OK - moving away from the actual calculations that have to be done, how would you store this data. If you were to use a tree structure, each node in the tree would need the move data (i.e. X and Y co-ords), a pointer to the next sibling node, a pointer to it's first child node and possible a parent-node pointer. Hence, you would need something like;
class CMoveNode {
public:
CMoveNode() {}
~CMoveNode() {}
BYTE m_XMove;
BYTE m_YMove;
CMoveNode *m_pNextSibling;
CMoveNode *m_pFirstChild;
CMoveNode *m_pParent;
private:
}; So, all in all a maximum of about (presuming 32-bit pointers), 3*32 + 2*8 = 96 + 16 = 112 bits per node = 14 bytes.
If you were to take the system to 4 levels deep, you'd have as a worst case scenario 9P4 nodes = 3024 nodes, * 14 = ~42K.
Hope that's useful, it's not something I've done before but I've read up on things like this. I don't proclaim to be an expert, but would also be interested to hear yours and others comments on these ideas. Maybe you could do an article when you've finished .
--
Andrew.
|
|
|
|
|
I'm pretty sure recursion for a function with as much code as AI would be over kill.
char gameBoard[9] = {0,0,0,
0,0,0,
0,0,0};
BOOL IsWin() const
{
char Piece = 'X';
...BEGIN loop
if(gameBoard[0] == Piece && gameBoard[1] == Piece && gameBoard[2] == Piece) return TRUE;
if(gameBoard[3] == Piece && gameBoard[4] == Piece && gameBoard[5] == Piece) return TRUE;
if(gameBoard[6] == Piece && gameBoard[7] == Piece && gameBoard[8] == Piece) return TRUE;
...
...
Piece = 'Y';
...END loop
return FALSE;
}
This is something like what I did
Cheers
"An expert is someone who has made all the mistakes in his or her field" - Niels Bohr
|
|
|
|
|
hey thank for the help... shoq, andrew, christian and hockeydude. well, i think its not gonna be an over kill to use recursion because i am only implementing a Tictactoe board. so theres only 9 possible moves. but i think ill try do both recursion and the list idea. for recursion, ill make moves made and if the board is all occupied as my base case. as the general case it will just continue look at at possible moves - the moves done. for the list idea. ill try to immitate the deep blue idea by making a list of all the moves and putting it on a List or a stack. after i finish this ill try show you guys what i came up with...
|
|
|
|
|
if u did the tic tac toe in trees can u send it to me coz i wanna know how to do it in recursion. Hisham86@aucegypt.edu this my e-mail
thanks,
|
|
|
|
|
Hello,
I have a MDI that has 2 different document types open at all times.. (CHtmlView and CListView) how do I, from CMainFrame, activate a document of my choice?
For example.. If I have my CListView document open.. I need to pick a menu option that will activate my CHtmlView and navigate to a url. Right now I have it setup so that if the CHtmlView is active and I select the menu option it will navigate to the url.. but if I have my CListView active and I select the menu item it crashes.. I need for the app to activate CHtmlView..
Any Ideas?
Rob Jones
|
|
|
|
|
Hi again, Rob,
If you have a pointer to the HtmlView, you can just:
vptView->GetParentFrame()->BringWindowToTop();
Otherwise, what you need to do is some searching through the doc templates again. Basically, once you find the DocTemplate for the HtmlView:
CDocTemplate *vptHtmlTemplate = GetTheHtmlDocTemplate();
POSITION vtDocPos;
CDocument *vptDoc;
POSITION vtViewPos;
CView *vptView;
vtDocPos = vptHtmlTemplate->GetFirstDocPosition();
if (vtDocPos != NULL)
{
vptDoc = vptHtmlTemplate->GetNextDoc(vtDocPos);
vtViewPos = vptDoc->GetFirstViewPosition();
if (vtViewPos != NULL)
{
vptView = vptDoc->GetNextView(vtViewPos);
vptView->GetParentFrame()->BringWindowToTop();
}
}
Hope this helps.
------------------------
Derek Waters
derek@lj-oz.com
|
|
|
|
|
Derek Waters wrote:
CDocTemplate *vptHtmlTemplate = GetTheHtmlDocTemplate();
I'm lost here.. I need to provide a pointer to my CMyHtmlView? Not sure how to do this. What is happening in the GetTheHtmlDocTemplate?
Thanks
Rob
|
|
|
|
|
Yeah, sorry Rob, basically you need to get a pointer to the DocTemplate for the HtmlView document type. This is like the function I sent you the other day for creating documents at startup:
CDocTemplate *GetTheHtmlDocTemplate()
{
CWinApp *vptrTheApp = AfxGetApp();
POSITION vtPos;
CDocTemplate *vptTemplate;
CString vcstrTitle;
vtPos = vptrTheApp->GetFirstDocTemplatePosition();
while (vtPos != NULL)
{
vptTemplate = vptrTheApp->GetNextDocTemplate(vtPos);
if (vptTemplate->GetDocString(vcstrTitle, CDocTemplate::fileNewName))
{
if (vcstrTitle.CompareNoCase(_T("MyHtmlDoc")) == 0)
{
return vptTemplate;
}
}
}
return NULL;
}
------------------------
Derek Waters
derek@lj-oz.com
|
|
|
|
|
You ROCK bud!!!
Thanks again for all your help.. That worked like a charm!
Rob
|
|
|
|
|
When I place all files together, the cpp. header and data files together, I mean, lump them all in one directory, e.g. in driver.cpp files, my program runs fine.
However, when I place them seperately into the source, header and resource file folders of a win32 console application project, the file compiles ok but it could not find the data file when I enter the data file's name in the console. I can open all the files including data file in VC++.
Is there anyway I can fix it? Sorry for the rudimentary question.
padgyx
|
|
|
|
|
Data file...as in
CFile myFile("Hello.dat, options);
If you don't enter the Path in the filename...the application uses the directory of the current process.
if your file resides in say C:\myCoolProjects\data
you should do:
CFile myFile("data\\Hello.dat", options);
I think this is what your after. And I hope this all works
Peace!
"An expert is someone who has made all the mistakes in his or her field" - Niels Bohr
|
|
|
|
|
As in MSDN, ON_CBN_DBLCLK only works with CBS_SIMPLE style.
So how to catch a double click in my CMyComboBox with dropdown-style. (I tried OnLButtonDblClk, OnDblclk, OnNcLButtonDblClk...)
thx
|
|
|
|
|