.
In my latest project, File Axe, I decided I wanted something very like the
little arrow buttons that one can find in DevStudio’s Tools|Customize…
property sheet, Tools tab. The little button on the right of the edit control
for “Arguments:” to be precise. So, after a quick browse on codeguru
reveled nothing, I decide it would not be hard to make, and I could wrap
Randy More’s cool way of using the TrackPopupMenu in immediate mode. I have a
feeling I will be using it more you see. (:
Uses code from…
The niffy way of using the menu in immediate mode is (directly) from
Using CMenu::TrackPopupMenu as an Immediate Function – Randy More,
General owner draw format from
Flat owner drawn buttons – Girish Bharadwaj,
and the idea for drawing the arrow from
PushButton with bitmap & text – Michael Santoro
UNICODE?
I have no way to test if this will work with UNICODE, however it
SHOULD. (:
This was compiled with VC5 and MFC4.2. Tested on Win95 OSR2 (no IE4
integration). This code should compile cleanly under warning level 4.
To Use:
Simply include
“
MenuButton.h”
and
“
MenuButton.cpp”
in your
project, and include
“
MenuButton.h”
in whatever file you wish to use it in
(
“
stdafx.h”
mayhaps).
Then in the dialog editor, make a normal button, a suggested size is 12
×
14. The
little arrow gfx will be centered in the button in any case. Make a handler for
a button click, and copy the sample usage code to there, then of course modify to suit your needs.
A way to use CMenuButton… (aka the sample usage code)
// -[Feral]---------------------------------------------------------------
// pop up a menu, and add pre defined text to the edit ctrl.
void CPP_Split::OnBUTTONNameFormatOptions()
{
// -[Feral]-----------------------------------------------------------
// Vars and Assignment
CEdit *pEdit = (CEdit*)GetDlgItem(IDC_EDIT_NameFormat);
// -[Feral]-----------------------------------------------------------
// popup a menu and let the user make a selection...
DWORD dwSelectionMade = m_menubuttonNameFormatOptions.DoSingleClick(IDM_NameFormatOptions);
// -[Feral]-----------------------------------------------------------
// Do something with the selection
// -------------------------------------------------------------------
// The value of dwSelectionMade is the id of the command selected or 0 if no selection was made
switch(dwSelectionMade)
{
default: // Do nothing (No selection)
break;
case `Menu Resource ID`:
pEdit->ReplaceSel(_T("`Text to add at cursor, or replace selection with`") );
break;
// Example case...
//Tip: Open the resource file (<apname>.rc) and copy your menu from there... much easier.
case ID_PREDEFINEDPOPUP_SAMPLE1FILENAME1XEXTSPLITPIECE: // "Sample #&1: Filename.1_X.Ext.SplitPiece",
pEdit->ReplaceSel(_T("<File>.<1_X>.<Ext>.SplitPiece") );
break;
}
// -[Feral]-----------------------------------------------------------
// Clean Up and Return
}
Questions, comments, bug fixes (gasp! (: ) and whatever else comes to mind are always welcome!
Happy Coding!
