|
Thanks Mark,
If you could post some sample code that would be great. I am just trying to use them as menu icons, button icons, tool bar icons, etc...
Any help you can provide would be great.
Thanks again.
BP
|
|
|
|
|
Here's an example of a Windows toolbar common control with two buttons...
Add these to your window class:
CToolBarCtrl ToolBar;
CImageList MyImageList;
Add this to your window class' .cpp file
static TBBUTTON ToolBarButtonDescs[] =
{
{0, ID_BUTTON1, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0,0}, 0, 0} ,
{1, ID_BUTTON2, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0,0}, 0, 0}
};
Add this to the window class constructor
MyImageList.Create(IDB_BITMAP, 18, 18, RGB(0x00,0xFF,0x00));
Add this to the window class' OnCreate() (WM_CREATE handler)
ToolBar.Create(WS_CHILD | WS_VISIBLE, CRect(0,0,100,20), this, ID_TOOLBAR);
ToolBar.SetImageList(&MyImageList);
ToolBar.AddButtons(sizeof(ToolBarButtonDescs) / sizeof(TBBUTTON), ToolBarButtonDescs);
The trick is creating the image list bitmap. In this case I have two buttons, 18 pixels wide so
add a bitmap resource 36x18. I've set the bitmap index for button 1 to index 0 and button 2 to
index 1 in the image list. So the rect (0,0,17,17) in the bitmap needs to be the image you want
on the first button and the rect (18,0,35,17) will be the image for the second button. I've
specified RGB(0x00,0xFF,0x00) (bright green) as the transparent color so draw any areas you want
to be transparent in that color. The image list bitmap is the images for all the buttons side-by-
side. I've used 18 pixel wide bitmap (per button) as an example but you can use whatever width
you want. The height will be calculated automagically based on the image width you specify in
this call:
MyImageList.Create(IDB_BITMAP, 18, 18, RGB(0x00,0xFF,0x00));
where the first 18 is the per-image width in the list and the second 18 is the grow-by value
when programatically adding bitmaps to the list.
You can use a different transparency color too.
Make sense?
|
|
|
|
|
Thanks Mark,
That is very understandable. I will apply what you have provided. For buttons, I guess I will use the SetImageList function...right?
Thanks again,
BP
|
|
|
|
|
BlitzPackage wrote: For buttons, I guess I will use the SetImageList function...right?
You can. I just took another look at that...its for XP+/Comclt32.dll version 6.0+ only.
For individual buttons you may want to use icon resources (for transparency)...
CButton button;
...
button.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON));
|
|
|
|
|
what i want:
i have a dialog with 4 buttons on it each time i push a button a different dialog will open and hide the first dialog then when i close that dialog the first opens again.
what i have:
i have it where it will open the other dialogs i just cant figure out how to get the first to reopen when i close the other dialogs.
i need the part that going in the other dialogs that will open the first dialog when it closes and cant figure it out.
this is in the main dialog
::ShowWindow(m_hWnd, SW_HIDE);<br />
p2->ShowWindow(SW_SHOW); <--- thoes 2 lines work
i tryed passing the handle of the main to the rest still didnt work
|
|
|
|
|
I am new to VC++/MFC, so I am sure someone will have a more elegant solution. Try this approach:
When the button is pushed on the first dialog, save whatever settings of the member variables you need, then call the default IDOK (CDialog::OnOK()) - default OnOK will close the dialog box
Call DoModal on the other Dialog, then, when finished before calling DoModal on the first dialog, set its member variable appropriately, then call DoModal
Hope this helps.
Peace,
BP
|
|
|
|
|
i got it!!!
|
|
|
|
|
|
p2->maindlg = m_hWnd; in main dialog and
void PrivacyCleaner::OnClose() <br />
{<br />
<br />
::ShowWindow(maindlg, SW_SHOW);<br />
CDialog::OnClose();<br />
}<br />
<br />
void PrivacyCleaner::OnCloseButton() <br />
{<br />
CDialog::EndDialog(0);<br />
OnClose(); <br />
}
in other dialogs
|
|
|
|
|
I just found this: http://msdn2.microsoft.com/en-us/library/wddd3ztw(VS.80).aspx
You can call CDialog::EndDialog(int nResult). Any value will do for nResult.
Hope this helps.
BP
|
|
|
|
|
Hi everyone
i am developing new class that inherits from mshflexgrid, i need it to be editable so, i have an edit box that is located in the current selected cell.
i need to have this edit box always visible even if the grid lost the focus
when the current cell is the previous one to the last(the whole number of row is 30 and 10 are visible), and am scrolling up (so the current cell should move down) the grid automatically scroll down to show the edit box again.
i want to stop this automatic scroll to keep the edit box invisible
how can i solve this please?
and thanks alot
|
|
|
|
|
Tarek Jabri wrote: mshflexgrid problem
Instead of fighting with the flex grid (which is what your going to be doing), try this grid MFC Grid control 2.26
by Chris Maunder [^]
I'd love to help, but unfortunatley I have prior commitments monitoring the length of my grass. :Andrew Bleakley:
|
|
|
|
|
I don't understand why this fails:
LPTSTR FileHelper::GetFileFullPath( LPWSTR lpwName )
{
LPTSTR lptFileFullPath;
DWORD len = GetCurrentDirectory( 0, NULL );
LPWSTR lpwFolder;
lpwFolder = (LPWSTR) malloc( len );
if ( lpwFolder == NULL )
{
free ( lpwFolder );
return NULL;
}
if ( GetCurrentDirectory( len, lpwFolder ) != 0 )
{
len = (DWORD) ( wcslen( lpwFolder ) + wcslen( lpwName ) + 6 );
lptFileFullPath = (LPTSTR) malloc( len );
// Here lptFileFullPath simply evaluates to NULL, showing the <bad ptr=""> ?!
if ( lptFileFullPath == NULL )
{
free ( lptFileFullPath );
return NULL;
}
// ...the rest of the code stripped off...
}
return lptFileFullPath;
}
This is under Visual Studio 2005, UNICODE defined by default.
Thanks.
|
|
|
|
|
I think your first malloc is wrong. "len" is the length of the current directory in characters but malloc() takes a number of bytes i.e. it should be sizeof(TCHAR) * len.
0 bottles of beer on the wall, 0 bottles of beer, you take 1 down, pass it around, 4294967295 bottles of beer on the wall.
Awasu 2.2.3 [^]: A free RSS/Atom feed reader with support for Code Project.
|
|
|
|
|
First, why are you not using new and delete ? and second, why are you calling free() on what you already know to be a NULL pointer?
Now for your problem, GetCurrentDirectory() is returning the length required excluding the terminating NULL character, but you are not adding this when you call malloc. so your second call will read the string and not write the NULL. Later when you call wstrlen(), it is reading the string uo until the first NULL it finds, which could be anywhere. Therefore may return an insanly high value. When used in malloc, it returns NULL because there is not enough memory.
The problem has nothing to do with sizeof(TCHAR)
|
|
|
|
|
Thanks, you are totally right.
|
|
|
|
|
I would recommend looking VERY closely at all the string functions you use.
Some use/return lengths in characters. Some use/return lengths in bytes.
Some include NULL terminator in lengths. Some do not.
LPTSTR FileHelper::GetFileFullPath( LPWSTR lpwName )
{
LPTSTR lptFileFullPath;
DWORD LenInChars = GetCurrentDirectory( 0, NULL );
++LenInChars;
LPWSTR lpwFolder;
lpwFolder = (LPWSTR) malloc( LenInChars * sizeof(TCHAR) );
if ( lpwFolder == NULL )
{
return NULL;
}
if ( GetCurrentDirectory( LenInChars, lpwFolder ) != 0 )
{
LenInChars = (DWORD) ( wcslen( lpwFolder ) + wcslen( lpwName ) + 1 );
lptFileFullPath = (LPTSTR) malloc( LenInChars * sizeof(TCHAR));
if ( lptFileFullPath == NULL )
{
free( lpwFolder );
return NULL;
}
}
free( lpwFolder );
return lptFileFullPath;
}
*EDIT* And for goodness sakes, use new/delete instead of malloc/free!!!
|
|
|
|
|
Haha...okay, I like your style (both of writing and of coding), and thanks for your help. Now 3 questions:
1. Why malloc sucks, I don't see any problems with it. New and delete is better when you are creating some objects that have a constructor and a destructor, as they get called automatically, but not if you use malloc. But here I only use strings and string pointers, so why?
2. I already rewrite the code, to use something like:
lpwFolder = (LPWSTR) malloc( (len + 1) * 2 );
Is it wrong? (Apart from not being elegant :=) ).
3. I use _tcslen instead of wcslen, is it better suited here?
Thanks for your help again.
|
|
|
|
|
damir_tk wrote: 1. Why malloc sucks, I don't see any problems with it. New and delete is better when you are creating some objects that have a constructor and a destructor, as they get called automatically, but not if you use malloc. But here I only use strings and string pointers, so why?
I didn't say it sucks You're using C++ so why not take advantage of the much stronger type
safety provided by the language? Using "new", you create a typed pointer so the compiler can
help point out mistakes during development because it knows the pointers type without having
to use the old C-style cast. Use what you want, of course, but I bet you'll find new and delete
much more pleasing to use.
damir_tk wrote: 2. I already rewrite the code, to use something like:
lpwFolder = (LPWSTR) malloc( (len + 1) * 2 );
Is it wrong? (Apart from not being elegant :=) ).
3. I use _tcslen instead of wcslen, is it better suited here?
The only thing I see that's not elegant is mixing the generic "T" types with the hard-coded "W"
types. By using the "T" types you have the advantage of your code working for both UNICODE and
non-UNICODE builds. It also fits the way the Windows APIs are declared.
If you know you are only ever going to use UNICODE then you could just use the "W" string types.
It's just easier to read the code if you stick to one set of types and functions.
This is all just my opinions of course.
Here's another version of your code using all "T" char types and new/delete...
LPTSTR FileHelper::GetFileFullPath( LPCTSTR lpwName )
{
LPTSTR lptFileFullPath;
DWORD LenInChars = ::GetCurrentDirectory( 0, NULL );
++LenInChars;
LPTSTR lpwFolder = new TCHAR[ LenInChars ];
if ( lpwFolder == NULL )
{
return NULL;
}
if ( ::GetCurrentDirectory( LenInChars, lpwFolder ) != 0 )
{
LenInChars = (DWORD)( _tcslen( lpwFolder ) + _tcslen( lpwName ) + 6 );
lptFileFullPath = new TCHAR[ LenInChars ];
if ( lptFileFullPath == NULL )
{
delete[] lpwFolder;
return NULL;
}
}
delete[] lpwFolder;
return lptFileFullPath;
}
|
|
|
|
|
Thank a lot. Point taken.
|
|
|
|
|
I have a property page which is derived from a class (CXYzproperty)
it has 5 TABS . One of the tab page is also derived from (CXYzproperty)
I want to colour the radio & check box in the tab page i tried to use the
OnCtlColor but it dont work . Actully i dont think the message is pumped
to the tab page .
Do anyone know how to do this .??
I found out that the Message WM_CTLCOLOR is not been passed to the Page inside the
Properth sheet . As shown below I have 5 tabs on the property sheet , when i open the
Tab 1 , In the constructor i create a page .The place were Vikas is written , i want
to change color of it ( ther are some radio & check box on that page );
------------------------------
| |
---- ---- ---- ---- --- |
| 1 | 2 | 3 | 4 | 5 | |
|--- ------------------------|
| |
| |
| Vikas |
| |
| |
| |
------------------------------
thanks in advance
-- modified at 7:07 Sunday 12th November, 2006
Vikas Amin
EATON
PUNE
|
|
|
|
|
vikas amin wrote: Vikas Amin
EATON
PUNE
So left Embin?
Nobody can give you wiser advice than yourself. - Cicero
|
|
|
|
|
Yes Sir
i have left embin & bombay
Can i know u ?
enjoy
Vikas Amin
EATON
PUNE
|
|
|
|
|
vikas amin wrote: Can i know u ?
We've met on CP before I think. I just remembered your previous signature when I read your name.. Vikas Amin, Embin Technologies, Bombay. Since it was different just asked you if you've shifted to a new location
Nobody can give you wiser advice than yourself. - Cicero
|
|
|
|
|
I should admit that u have a good memory
Have a nice day
Vikas Amin
EATON
PUNE
|
|
|
|
|