📄 statusbar.cpp
字号:
#include <windows.h>
#include <richedit.h>
#include <commctrl.h>
#include "statusbar.h"
#pragma comment(lib,"comctl32.lib")
HINSTANCE hInst; // current instance
HWND hWnd,hWndRichEdit,hWndStatusBar;
HDC hdcGlobal;
int iFace,nFaces;
PTRUETYPEFONTINFO pArrayOfTTFInfo;
#define NUM_PARTS 3
int pPartsWidth[]={200,226,-1};
HBITMAP hBmpAlignLeft,hBmpAlignCenter,hBmpAlignRight,hBmpAlign;
HMODULE hRTFLib,hCMMLib;
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
INITCOMMONCONTROLSEX cc;
cc.dwSize=sizeof(cc);
cc.dwICC=ICC_BAR_CLASSES;
InitCommonControlsEx(&cc);
hRTFLib=LoadLibrary("RICHED32.DLL");
hCMMLib=LoadLibrary("COMMCTRL.DLL");
if (!InitApplication(hInstance))
return FALSE;
if (!InitInstance(hInstance,nCmdShow))
return FALSE;
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
BOOL InitApplication(HINSTANCE hInstance)
{
WNDCLASS wc;
wc.style = NULL;
wc.lpfnWndProc = (WNDPROC)MainWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszClassName = "statusbarWClass";
wc.lpszMenuName = "statusbarMenu";
return RegisterClass(&wc);
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance; // Store instance handle in our global variable
hWnd = CreateWindow("statusbarWClass",
"statusbar Window",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
if (!hWnd)
return FALSE;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
static TCHAR szBuf[128];
static TCHAR szFontString[1024];
static int nCurSize;
static BOOL bShowStatusBar=true;
static int nCyStatusBar;
static int nCyClient,nCxClient;
CHARFORMAT CharFormat;
UINT uItem;
RECT rcStatusBar;
switch (message) {
case WM_CREATE:
hBmpAlignLeft =LoadBitmap(hInst,"alignleft");
hBmpAlignCenter =LoadBitmap(hInst,"aligncenter");
hBmpAlignRight =LoadBitmap(hInst,"alignright");
hWndRichEdit =CreateWindowEx(WS_EX_CLIENTEDGE,"RICHEDIT",
"",
WS_CHILD|WS_VISIBLE|ES_MULTILINE|ES_SAVESEL|WS_VSCROLL|WS_HSCROLL,
0,0,0,0,
hWnd,
(HMENU)ID_RICHEDIT,
hInst,
NULL);
SendMessage(hWndRichEdit,EM_SETEVENTMASK,0,ENM_SELCHANGE);
// hWndStatusBar =CreateStatusWindow(
// WS_CHILD|WS_VISIBLE|SBARS_SIZEGRIP,
// "",
// hWnd,
// ID_STATUSBAR);
hWndStatusBar =CreateWindow(STATUSCLASSNAME, "",
WS_CHILD|WS_VISIBLE|SBARS_SIZEGRIP,
0,0,0,0,
hWnd,
(HMENU)ID_STATUSBAR,
hInst,
NULL);
SendMessage(hWndStatusBar,SB_SETPARTS,(WPARAM)NUM_PARTS,(LPARAM)pPartsWidth);
wsprintf(szBuf,"READY!");
SendMessage(hWndStatusBar,SB_SETTEXT,0|SBT_NOBORDERS,(LPARAM)szBuf);
hBmpAlign=hBmpAlignLeft;
SendMessage(hWndStatusBar,SB_SETTEXT,1|SBT_OWNERDRAW|SBT_POPOUT,(LPARAM)hBmpAlign);
SendMessage(hWndStatusBar,SB_SETTEXT,2,(LPARAM)"charformat:font,size,style effect");
hdc=GetDC(hWndRichEdit);
pArrayOfTTFInfo=BuildFontList(hdc);
ReleaseDC(hWndRichEdit,hdc);
SetFocus(hWndRichEdit);
CharFormat.cbSize=sizeof(CHARFORMAT);
CharFormat.dwMask=CFM_ITALIC|CFM_BOLD|CFM_UNDERLINE|CFM_STRIKEOUT|CFM_FACE;
CharFormat.dwEffects=0;
lstrcpy(CharFormat.szFaceName,pArrayOfTTFInfo[0].plf->lfFaceName);
SendMessage(hWndRichEdit,EM_SETCHARFORMAT,SCF_SELECTION,(LPARAM)&CharFormat);
CheckMenuRadioItem(GetMenu(hWnd),
IDM_ALIGNLEFT,IDM_ALIGNRIGHT,
IDM_ALIGNLEFT,
MF_BYCOMMAND);
break;
case WM_INITMENUPOPUP:
if(HIWORD(lParam)) break;
if(SendMessage(hWndRichEdit,EM_CANUNDO,0,0))
EnableMenuItem(GetMenu(hWnd),
IDM_EDITUNDO,
MF_BYCOMMAND|MF_ENABLED);
else
EnableMenuItem(GetMenu(hWnd),
IDM_EDITUNDO,
MF_BYCOMMAND|MF_GRAYED);
if(SendMessage(hWndRichEdit,EM_CANPASTE,0,0))
EnableMenuItem(GetMenu(hWnd),
IDM_EDITPASTE,
MF_BYCOMMAND|MF_ENABLED);
else
EnableMenuItem(GetMenu(hWnd),
IDM_EDITPASTE,
MF_BYCOMMAND|MF_GRAYED);
break;
case WM_SIZE:
if(bShowStatusBar) GetWindowRect(hWndStatusBar,&rcStatusBar);
nCyStatusBar=rcStatusBar.bottom-rcStatusBar.top;
nCyClient=HIWORD(lParam);
nCxClient=LOWORD(lParam);
MoveWindow(hWndRichEdit,0,0,
nCxClient,bShowStatusBar?nCyClient-nCyStatusBar:nCyClient,TRUE);
if(bShowStatusBar)
MoveWindow(hWndStatusBar,0,nCyClient-nCyStatusBar,nCxClient,nCyClient,TRUE);
break;
case WM_MENUSELECT:
if(LoadString(hInst,LOWORD(wParam),szBuf,128))
SendMessage(hWndStatusBar,SB_SETTEXT,0|SBT_NOBORDERS,(LPARAM)szBuf);
else
SendMessage(hWndStatusBar,SB_SETTEXT,0|SBT_NOBORDERS,(LPARAM)"good luck!");
break;
case WM_DRAWITEM:
if((int)wParam==ID_STATUSBAR)
{
LPDRAWITEMSTRUCT lpdis;
HDC hdcMem;
BITMAP bitmap;
lpdis=(LPDRAWITEMSTRUCT)lParam;
hdcMem=CreateCompatibleDC(lpdis->hDC);
SelectObject(hdcMem,hBmpAlign);
GetObject(hBmpAlignLeft,sizeof(bitmap),&bitmap);
BitBlt(lpdis->hDC,lpdis->rcItem.left+5,lpdis->rcItem.top+1,
bitmap.bmWidth,bitmap.bmHeight,hdcMem,0,0,SRCCOPY);
DeleteDC(hdcMem);
}
break;
case WM_NOTIFY:
switch(((LPNMHDR)lParam)->code){
case EN_SELCHANGE:
UpdateCaretPositionState(hWndRichEdit,hWndStatusBar);
UpdateAlignState(hWnd,hWndRichEdit,hWndStatusBar);
UpdateCharFormatState(hWnd,hWndRichEdit,hWndStatusBar);
break;
default:
return (DefWindowProc(hWnd, message, wParam, lParam));
}
break;
case WM_COMMAND:
uItem=LOWORD(wParam);
switch (uItem) {
case IDM_BOLD:
case IDM_ITALIC:
case IDM_UNDERLINE:
case IDM_STRIKEOUT:
HandleCharEffectCommand(hWndRichEdit,uItem);
UpdateCharFormatState(hWnd,hWndRichEdit,hWndStatusBar);
break;
case IDM_SHOWSTATUSBAR:
bShowStatusBar=!bShowStatusBar;
CheckMenuItem(GetMenu(hWnd),
IDM_SHOWSTATUSBAR,
MF_BYCOMMAND|
(bShowStatusBar?MF_CHECKED:MF_UNCHECKED));
ShowWindow(hWndStatusBar,(bShowStatusBar?SW_SHOW:SW_HIDE));
MoveWindow(hWndRichEdit,0,0,
nCxClient,bShowStatusBar?nCyClient-nCyStatusBar:nCyClient,TRUE);
if(bShowStatusBar)
MoveWindow(hWndStatusBar,0,nCyClient-nCyStatusBar,nCxClient,nCyClient,TRUE);
break;
case IDM_ALIGNLEFT:
case IDM_ALIGNCENTER:
case IDM_ALIGNRIGHT:
HandleAlignCommand(hWnd,hWndRichEdit,uItem);
UpdateAlignState(hWnd,hWndRichEdit,hWndStatusBar);
break;
case IDM_EDITUNDO:
SendMessage(hWndRichEdit,WM_UNDO,0,0);
break;
case IDM_EDITCOPY:
SendMessage(hWndRichEdit,WM_COPY,0,0);
break;
case IDM_EDITCUT:
SendMessage(hWndRichEdit,WM_CUT,0,0);
break;
case IDM_EDITPASTE:
SendMessage(hWndRichEdit,WM_PASTE,0,0);
break;
case IDM_EDITDELETE:
SendMessage(hWndRichEdit,WM_CLEAR,0,0);
break;
case IDM_EDITSELECTALL:
SendMessage(hWndRichEdit,EM_SETSEL,0,-1);
break;
case IDM_SELECTFONTFACE:
DialogBox(hInst,
"SELECTFONTFACEDLGBOX",
hWnd,
(DLGPROC)SelectFontFaceDlgProc);
break;
case IDM_SELECTFONTSIZE:
DialogBox(hInst,
"SELECTFONTSIZEDLGBOX",
hWnd,
(DLGPROC)SelectFontSizeDlgProc);
break;
case IDM_ABOUT:
DialogBox(hInst,
"ABOUTBOX",
hWnd,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -