📄 cosmo.cpp
字号:
m_hBmpLines[i]=CreateCompatibleBitmap(hMemDC, cx, cy);
SelectObject(hMemDC, m_hBmpLines[i]);
PatBlt(hMemDC, 0, 0, cx, cy, WHITENESS);
hPen=CreatePen(i, 1, 0L); //i=line style like PS_SOLID
hObj=SelectObject(hMemDC, hPen);
MoveToEx(hMemDC, 0, cy/2, NULL);
LineTo(hMemDC, cx, cy/2);
ModifyMenu(hMenu, IDM_LINEMIN+i, MF_BYCOMMAND | MF_BITMAP
, IDM_LINEMIN+i, (LPTSTR)(LONG)(UINT)m_hBmpLines[i]);
SelectObject(hMemDC, hObj);
DeleteObject(hPen);
}
CheckMenuItem(hMenu, IDM_LINESOLID, MF_CHECKED);
DeleteDC(hMemDC);
return;
}
/*
* CCosmoFrame::CreateToolbar
*
* Purpose:
* Procedure to create all the necessary toolbar buttons.
*
* Parameters:
* None
*
* Return Value:
* UINT Number of tools added to the bar.
*/
UINT CCosmoFrame::CreateToolbar(void)
{
UINT iLast;
UINT uState=GIZMO_NORMAL;
UINT utCmd =GIZMOTYPE_BUTTONCOMMAND;
UINT utEx =GIZMOTYPE_BUTTONATTRIBUTEEX;
//Insert the standard ones.
iLast=CFrame::CreateToolbar();
/*
* Insert File Import in the 5th position and account for
* it in iLast.
*/
m_pTB->Add(utCmd, 4, IDM_FILEIMPORT, m_dxB, m_dyB
, NULL, m_hBmp, 2, uState);
iLast++;
//Separator
m_pTB->Add(GIZMOTYPE_SEPARATOR, iLast++, 0, 6, m_dyB
, NULL, NULL, 0, uState);
/*
* For the Background bitmap, preserve our use of black
* (part of the image)
*/
m_pTB->Add(utCmd, iLast++, IDM_COLORBACKGROUND, m_dxB, m_dyB
, NULL, m_hBmp, 3, GIZMO_NORMAL | PRESERVE_BLACK);
m_pTB->Add(utCmd, iLast++, IDM_COLORLINE, m_dxB, m_dyB
, NULL, m_hBmp, 4, uState);
//Separator
m_pTB->Add(GIZMOTYPE_SEPARATOR, iLast++, 0, 6, m_dyB
, NULL, NULL, 0, uState);
//Line styles.
m_pTB->Add(utEx, iLast++, IDM_LINESOLID, m_dxB, m_dyB
, NULL, m_hBmp, 5, uState);
m_pTB->Add(utEx, iLast++, IDM_LINEDASH, m_dxB, m_dyB
, NULL, m_hBmp, 6, uState);
m_pTB->Add(utEx, iLast++, IDM_LINEDOT, m_dxB, m_dyB
, NULL, m_hBmp, 7, uState);
m_pTB->Add(utEx, iLast++, IDM_LINEDASHDOT, m_dxB, m_dyB
, NULL, m_hBmp, 8, uState);
m_pTB->Add(utEx, iLast++, IDM_LINEDASHDOTDOT, m_dxB, m_dyB
, NULL, m_hBmp, 9, uState);
return iLast;
}
/*
* CCosmoFrame::OnCommand
*
* Purpose:
* WM_COMMAND handler for the Cosmo frame window that just
* processes the line menu and the color menu leaving the
* CFrame to do everything else.
*
* Parameters:
* hWnd HWND of the frame window.
* wParam WPARAM of the message.
* lParam LPARAM of the message.
*
* Return Value:
* LRESULT Return value for the message.
*/
LRESULT CCosmoFrame::OnCommand(HWND hWnd, WPARAM wParam
, LPARAM lParam)
{
PCCosmoDoc pDoc;
TCHAR szFile[CCHPATHMAX];
BOOL fOK;
UINT i, uTemp;
COLORREF rgColors[16];
CHOOSECOLOR cc;
COMMANDPARAMS(wID, wCode, hWndMsg);
/*
* Don't bother with anything during first initialization,
* skipping many toolbar notifications.
*/
if (m_fInit)
return 0L;
pDoc=(PCCosmoDoc)m_pCL->ActiveDocument();
/*
* Check for the line style commands which are
* IDM_LINEMIN+<style>. We handle this by changing the menu
* and toolbar, then we pass it to the document for real
* processing.
*/
if (NULL!=pDoc && IDM_LINEMIN <= wID && IDM_LINEMAX >=wID)
{
CheckLineSelection(wID);
pDoc->LineStyleSet(wID-IDM_LINEMIN);
return 0L;
}
switch (wID)
{
case IDM_FILEIMPORT:
szFile[0]=0;
fOK=SaveOpenDialog(szFile, CCHPATHMAX, IDS_FILEIMPORT
, TRUE, &i);
if (fOK)
{
uTemp=pDoc->Load(FALSE, szFile);
pDoc->ErrorMessage(uTemp);
}
return (LRESULT)fOK;
case IDM_COLORBACKGROUND:
case IDM_COLORLINE:
//Invoke the color chooser for either color
uTemp=(IDM_COLORBACKGROUND==wID)
? DOCCOLOR_BACKGROUND : DOCCOLOR_LINE;
for (i=0; i<16; i++)
rgColors[i]=RGB(0, 0, i*16);
memset(&cc, 0, sizeof(CHOOSECOLOR));
cc.lStructSize=sizeof(CHOOSECOLOR);
cc.lpCustColors=rgColors;
//CHAPTER23MOD
/*
* If we're in-place active, use the container's frame
* window instead of our own as the parent of the dialog.
*/
if (NULL!=m_pIOleIPFrame)
m_pIOleIPFrame->GetWindow(&cc.hwndOwner);
else
cc.hwndOwner=hWnd;
//End CHAPTER23MOD
cc.Flags=CC_RGBINIT;
cc.rgbResult=pDoc->ColorGet(uTemp);
if (ChooseColor(&cc))
pDoc->ColorSet(uTemp, cc.rgbResult);
break;
//CHAPTER23MOD
case ID_HATCHWINDOW:
//Open the in-place object on hatch border double-click.
if (HWN_BORDERDOUBLECLICKED==wCode)
pDoc->OpenInPlaceObject();
break;
case IDM_EDITOPEN:
//Invoke the OPEN verb on the current object.
pDoc->OpenInPlaceObject();
break;
//End CHAPTER23MOD
default:
CFrame::OnCommand(hWnd, wParam, lParam);
}
return 0L;
}
/*
* CCosmoFrame::OnDocumentDataChange
*
* Purpose:
* Update the Line menu and toolbar if the style in the data
* changes.
*
* Parameters:
* pDoc PCDocument notifying the sink.
*
* Return Value:
* None
*/
void CCosmoFrame::OnDocumentDataChange(PCDocument pDoc)
{
CheckLineSelection(IDM_LINEMIN
+((PCCosmoDoc)pDoc)->LineStyleGet());
return;
}
/*
* CCosmoFrame::OnDocumentActivate
*
* Purpose:
* Informs us that document activation changed, so update the UI
* for that new document.
*
* Parameters:
* pDoc PCDocument notifying the sink.
*
* Return Value:
* None
*/
void CCosmoFrame::OnDocumentActivate(PCDocument pDoc)
{
CheckLineSelection(IDM_LINEMIN
+((PCCosmoDoc)pDoc)->LineStyleGet());
return;
}
/*
* CCosmoFrame::UpdateMenus
*
* Purpose:
* Handles the WM_INITMENU message for the frame window. Depending
* on the existence of an active window, menu items are selectively
* enabled and disabled.
*
* Parameters:
* hMenu HMENU of the menu to intialize
* iMenu UINT position of the menu.
*
* Return Value:
* None
*/
void CCosmoFrame::UpdateMenus(HMENU hMenu, UINT iMenu)
{
PCDocument pDoc;
BOOL fOK=FALSE;
BOOL fCallDefault=TRUE;
UINT i;
UINT uTemp;
UINT uTempE;
UINT uTempD;
pDoc=m_pCL->ActiveDocument();
uTempE=MF_ENABLED | MF_BYCOMMAND;
uTempD=MF_DISABLED | MF_GRAYED | MF_BYCOMMAND;
uTemp=((NULL!=pDoc) ? uTempE : uTempD);
//File menu: If there is document window, disable Import.
if (m_phMenu[0]==hMenu)
EnableMenuItem(hMenu, IDM_FILEIMPORT, uTemp);
//Color menu: no document, no commands
if (m_phMenu[2]==hMenu)
{
EnableMenuItem(hMenu, IDM_COLORBACKGROUND, uTemp);
EnableMenuItem(hMenu, IDM_COLORLINE, uTemp);
fCallDefault=FALSE;
}
//Line menu: no document, no commands
if (m_phMenu[3]==hMenu)
{
for (i=IDM_LINEMIN; i<=IDM_LINEMAX; i++)
EnableMenuItem(hMenu, i, uTemp);
fCallDefault=FALSE;
}
if (fCallDefault)
CFrame::UpdateMenus(hMenu, iMenu);
return;
}
/*
* CCosmoFrame::UpdateToolbar
*
* Purpose:
* Enables and disables tools depending on whether we have
* a document or not.
*
* Parameters:
* None
*
* Return Value:
* None
*/
void CCosmoFrame::UpdateToolbar(void)
{
BOOL fLast;
UINT i;
//Save the last enabled state before CFrame changes it
fLast=m_fLastEnable;
//Let the default hack on its tools
CFrame::UpdateToolbar();
/*
* If CFrame::UpdateToolbar changed anything, then we need
* to change as well--if nothing changes, nothing to do.
*/
if (fLast!=m_fLastEnable)
{
m_pTB->Enable(IDM_FILEIMPORT, m_fLastEnable);
m_pTB->Enable(IDM_COLORBACKGROUND, m_fLastEnable);
m_pTB->Enable(IDM_COLORLINE, m_fLastEnable);
for (i=IDM_LINEMIN; i <= IDM_LINEMAX; i++)
m_pTB->Enable(i, m_fLastEnable);
}
return;
}
/*
* CCosmoFrame::CheckLineSelection
*
* Purpose:
* Maintains the bitmap menu and the tools for the line selection.
* Both are mutially exclusive option lists where a selection in
* one has to affect the other.
*
* Parameters:
* uID UINT ID of the item to be selected
*
* Return Value:
* None
*/
void CCosmoFrame::CheckLineSelection(UINT uID)
{
UINT i;
HMENU hMenu;
//Update menus and tools if the selection changed.
if (uID!=m_uIDCurLine)
{
m_uIDCurLine=uID;
//CHAPTER23MOD
/*
* Should only check on the popup, not on the main menu since it
* could be a shared menu at the moment.
*/
hMenu=m_phMenu[3];
//End CHAPTER23MOD
//Uncheck all lines initially.
for (i=IDM_LINEMIN; i<=IDM_LINEMAX; i++)
CheckMenuItem(hMenu, i, MF_UNCHECKED | MF_BYCOMMAND);
CheckMenuItem(hMenu, uID, MF_CHECKED | MF_BYCOMMAND);
m_pTB->Check(uID, TRUE);
//CHAPTER23MOD
//Affect in-place toolbar as well
if (NULL!=g_pInPlaceTB)
g_pInPlaceTB->Check(uID, TRUE);
//End CHAPTER23MOD
}
return;
}
/*
* CCosmoFrame::UpdateEmbeddingUI
*
* Purpose:
* Puts the application into the user interface for editing an
* embedded object, manipulating menus and title bars.
*
* Parameters:
* fEmbedding BOOL TRUE to go in the mode, FALSE to leave it.
* pszApp LPCTSTR name of the container application as
* received in IOleObject::SetHostNames.
* pszObj LPCTSTR name of the object in the container as
* received in IOleObject::SetHostNames.
*
* Return Value:
* None
*/
void CCosmoFrame::UpdateEmbeddingUI(BOOL fEmbedding
, PCDocument pDoc, LPCTSTR pszApp, LPCTSTR pszObj)
{
HMENU hMenu;
TCHAR szTemp[256];
//First let's play with the File menu.
hMenu=m_phMenu[0];
//Remove or add the File New, Open, and Save items
if (fEmbedding)
{
DeleteMenu(m_phMenu[0], IDM_FILENEW, MF_BYCOMMAND);
DeleteMenu(m_phMenu[0], IDM_FILEOPEN, MF_BYCOMMAND);
DeleteMenu(m_phMenu[0], IDM_FILECLOSE, MF_BYCOMMAND);
DeleteMenu(m_phMenu[0], IDM_FILESAVE, MF_BYCOMMAND);
//Save As->Save Copy As
ModifyMenu(m_phMenu[0], IDM_FILESAVEAS, MF_BYCOMMAND
, IDM_FILESAVEAS, PSZ(IDS_SAVECOPYAS));
}
else
{
InsertMenu(m_phMenu[0], 0, MF_BYPOSITION, IDM_FILENEW
, PSZ(IDS_NEW));
InsertMenu(m_phMenu[0], 1, MF_BYPOSITION, IDM_FILEOPEN
, PSZ(IDS_OPEN));
InsertMenu(m_phMenu[0], 2, MF_BYPOSITION, IDM_FILESAVE
, PSZ(IDS_SAVE));
InsertMenu(m_phMenu[0], 3, MF_BYPOSITION, IDM_FILECLOSE
, PSZ(IDS_SAVE));
//Save Copy As->Save As
ModifyMenu(m_phMenu[0], IDM_FILESAVEAS, MF_BYCOMMAND
, IDM_FILESAVEAS, PSZ(IDS_SAVEAS));
}
//Change "Exit" to "Exit & Return to xx" or vice-versa for SDI
if (fEmbedding)
wsprintf(szTemp, PSZ(IDS_EXITANDRETURN), (LPSTR)pszObj);
else
lstrcpy(szTemp, PSZ(IDS_EXIT));
ModifyMenu(m_phMenu[0], IDM_FILEEXIT, MF_STRING, IDM_FILEEXIT
, szTemp);
DrawMenuBar(m_hWnd);
//Now let's play with the toolbar.
m_pTB->Show(IDM_FILENEW, !fEmbedding);
m_pTB->Show(IDM_FILEOPEN, !fEmbedding);
m_pTB->Show(IDM_FILECLOSE, !fEmbedding);
m_pTB->Show(IDM_FILESAVE, !fEmbedding);
//Enable what's left appropriately.
UpdateToolbar();
//Now play with the title bar.
//IDS_EMBEDDINGCAPTION is MDI/SDI sensitive in COSMO.RC.
wsprintf(szTemp, PSZ(IDS_EMBEDDINGCAPTION), pszObj);
/*
* Remember that in MDI situations that Windows takes care of
* the frame window caption bar when the document is maximized.
*/
#ifdef MDI
SetWindowText(pDoc->Window(), szTemp);
#else
SetWindowText(m_hWnd, szTemp);
#endif
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -