1添加状态栏图片
继承CStatusBar类,重新DrawItem函数
void CBitmapStatusBar::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
UINT nID,nStyle;
int nWidth;
GetPaneInfo(lpDrawItemStruct->itemID, nID, nStyle, nWidth);
switch(nID)
{
// 如果是CAPS格则处理
case ID_INDICATOR_CAPS:
//从资源中选择位图
CBitmap pBitmap;
//加载位图
pBitmap.LoadBitmap(IDB_MY_BITMAP);
//将状态条附加到一个CDC对象
CDC dc,SourceDC;
dc.Attach(lpDrawItemStruct->hDC);
//得到状态条窗格的大小和坐标
CRect rect(&lpDrawItemStruct->rcItem);
//将当前位图放入兼容CDC
SourceDC.CreateCompatibleDC(NULL);
CBitmap* pOldBitmap = SourceDC.SelectObject(&pBitmap);
dc.BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),&SourceDC, 0, 0, SRCCOPY);
SourceDC.SelectObject(pOldBitmap);
pBitmap.DeleteObject();
dc.Detach();
return;
}
CStatusBar::DrawItem(lpDrawItemStruct);
}
将CMainFrame的CStatusBar,改为继承的子类。
CMainFrame::OnCreate中添加
UINT nID,nStyle;
int nPane,nWidth;
nPane = m_wndStatusBar.CommandToIndex(ID_INDICATOR_CAPS);
m_wndStatusBar.GetPaneInfo(nPane, nID, nStyle, nWidth) ;
m_wndStatusBar.SetPaneInfo(nPane, nID, SBPS_OWNERDRAW|SBPS_NOBORDERS, nWidth + 30);
//m_wndStatusBar.SetPaneInfo(2,ID_SEPARATOR,SBPS_NORMAL,nWidth);
//m_wndStatusBar.SetPaneInfo(1,ID_SEPARATOR,SBPS_NORMAL,nWidth);
//m_wndStatusBar.SetPaneInfo(3,ID_INDICATOR_SCRL,SBPS_NORMAL,nWidth);
//m_wndStatusBar.SetPaneText(3, _T("0"), TRUE);
//m_wndStatusBar.SetPaneText(1, _T("1"), TRUE);
//m_wndStatusBar.SetPaneText(2, _T("2"), TRUE);
//nPane = m_wndStatusBar.CommandToIndex(ID_INDICATOR_SCRL);
//m_wndStatusBar.GetStatusBarCtrl().SetText(_T("hello"), 0, 0);
//m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
------------------------------------------------------------------------------
2添加菜单
CMenu *pMenu = AfxGetMainWnd()->GetMenu(); //得到主框架菜单
pMenu->GetSubMenu(2)->AppendMenu(MF_SEPARATOR);//添加菜单分隔符
pMenu->GetSubMenu(2)->AppendMenu(MF_STRING, IDM_ACTION_MENU, "动态菜单(&A)");//添加菜单
-------------------------------------------------------------------------------
3添加滚动条到状态栏
继承CStatusBar类(同1)
int CProgressStatusBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
VERIFY(CStatusBar::OnCreate(lpCreateStruct) ==0 );
VERIFY(m_ProgressCtrl.Create(WS_CHILD|WS_VISIBLE, CRect(0,0,0,0), this, IDC_PROGRESS));
return 0;
}
void CProgressStatusBar::OnSize(UINT nType, int cx, int cy)
{
CStatusBar::OnSize(nType, cx, cy);
CRect rect;
GetItemRect(1, &rect);
m_ProgressCtrl.MoveWindow(rect); //CProgressCtrl
}
-----------------------------------------------------------------------
4状态栏中,滚动字幕
/在定时器中执行字幕程序
void CMainFrame::OnTimer(UINT nIDEvent)
{
static int strID = 0; //字符索引
//达到滚动字幕的末尾
if (strID >= (m_strStatusText.GetLength() - 1))
{
strID = 0;
}
m_wndStatusBar.SetPaneText(m_wndStatusBar.CommandToIndex(ID_SEPARATOR), ((LPCSTR) m_strStatusText) + strID);
//后移显示的字幕,由于汉字占两位,所以+2
strID = strID + 2;
CFrameWnd::OnTimer(nIDEvent);
}
-------------------------------------------------------------------------------------
5 图片 菜单
m_bitmap.LoadBitmap(IDB_BITMAP1); //加载位图
CMenu *pMenu = GetMenu();//获得菜单指针
//修改“位图菜单”->“菜单一”为位图菜单
pMenu->GetSubMenu(4)->ModifyMenu(ID_MENU_BMP, MF_BYCOMMAND, ID_MENU_BMP, &m_bitmap);
//ModifyMenu可以修改菜单的各种属性,check 文字 ==
--------------------------------------------------------------------------------
6 右键菜单
WM_CONTENTMENU
CMenu contextMenu;
contextMenu.LoadMenu(IDR_CONTEXTMENU);//加载已有的菜单
CMenu *pPopupMenu=contextMenu.GetSubMenu(0);//获得弹出菜单指针
ClientToScreen(&point);//转换鼠标坐标
//弹出菜单
pPopupMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, AfxGetMainWnd());
----------------------------------------------------------------------------------
7屏蔽系统菜单(只能alt+F4,或者任务管理器退出)
CMainFrame::PreCreateWindow中 加入cs.style &= ~WS_SYSMENU;
----------------------------------------------------------------------------------
8截获消息
使系统菜单失效
LRESULT CMFCDLGDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if (message == WM_SYSCOMMAND)
{
if (wParam == SC_MAXIMIZE || wParam == SC_MINIMIZE || wParam == SC_CLOSE)
{
return TRUE;
}
}
return CWnd::WindowProc(message, wParam, lParam);
}
-----------------------------------------------------------------------------
9全屏
void CMainFrame::FullScreen()
{
GetWindowPlacement(&m_oldWinPos);// 得到当前窗口的位置
CRect winRect;// 窗口区域
GetWindowRect(&winRect);// 得到窗口区域
CRect rectClient;
RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery, &rectClient); // 全屏时隐藏所有的控制条
ClientToScreen(&rectClient);// 将客户坐标映射成屏幕坐标
//获取屏幕分辨率
int fullWidth = GetSystemMetrics(SM_CXSCREEN);
int fullHeight = GetSystemMetrics(SM_CYSCREEN);
//得到全屏显示的窗口位置
m_fullScreenRect.left = winRect.left - rectClient.left;
m_fullScreenRect.top = winRect.top - rectClient.top;
m_fullScreenRect.right = winRect.right - rectClient.right + fullWidth;
m_fullScreenRect.bottom= winRect.bottom - rectClient.bottom + fullHeight;
// 进入全屏显示状态
m_fullScreenFlag = TRUE;// 设置全屏标志
WINDOWPLACEMENT tmp;
tmp.length = sizeof(WINDOWPLACEMENT);
tmp.flags = 0;
tmp.showCmd = SW_SHOWNORMAL;
tmp.rcNormalPosition = m_fullScreenRect;
SetWindowPlacement(&tmp);// 将窗口设置到m_fullScreenRect位置上
}
// 结束程序窗口全屏显示,恢复窗口原来大小
void CMainFrame::EndFullScreen()
{
if(m_fullScreenFlag)
{
m_fullScreenFlag = FALSE;// 设置全屏状态为FALSE
SetWindowPlacement(&m_oldWinPos);// 退出全屏显示, 恢复原窗口显示
}
}
void CXXXXXView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if(nChar == VK_F11)
{
// 获取主框架窗口的指针
CMainFrame* pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
if(pFrame->GetScreenState()) // 如果现在是全屏状态
{
// 调用主窗口类的自定义函数 EndFullScreen,退出全屏显示状态
pFrame->EndFullScreen();
}
else // 不是全屏状态
{
// 调用主窗口类的自定义函数 FullScreen ,进入全屏显示状态
pFrame->FullScreen();
}
}
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
---------------------------------------------------------------------------
10。隐藏菜单栏
void CHideMenuBarView::OnLButtonDown(UINT nFlags, CPoint point)
{
//隐藏菜单栏
::SetMenu(AfxGetMainWnd()->m_hWnd, NULL);
CView::OnLButtonDown(nFlags, point);
}
//右击处理函数
void CHideMenuBarView::OnRButtonDown(UINT nFlags, CPoint point)
{
//显示菜单栏
CMenu menu;
menu.LoadMenu(IDR_MAINFRAME);//加载菜单
HMENU hMenu = (HMENU)menu;//类型转换
::SetMenu(AfxGetMainWnd()->m_hWnd, hMenu);//设置菜单
CView::OnRButtonDown(nFlags, point);
}
----------------------------------------------------------------------------
11.隐藏标题栏 更改窗口风格
void CMainFrame::OnMenuShowtitlebar()
{
LONG style = GetWindowLong(m_hWnd, GWL_STYLE); //得到窗口类型
if ((style | WS_CAPTION) == style)
{
MessageBox(_T("the same style"));
}
else
{
style |= WS_CAPTION;//修改窗口类型,显示标题栏
SetWindowLong(m_hWnd, GWL_STYLE, style);//设置窗口类型
//移动窗口使显示标题栏立即生效
RECT winRect;
GetWindowRect(&winRect);//得到窗口位置
winRect.top--;//窗口下移
MoveWindow(&winRect); //移动窗口
}
}
void CMainFrame::OnMenuHidetitlebar()
{
LONG style = GetWindowLong(m_hWnd, GWL_STYLE); //得到窗口类型
if ((style & (~(WS_CAPTION))) == style)
{
MessageBox(_T("the same style"));
}
else
{
style &= ~(WS_CAPTION);//修改窗口类型,显示标题栏
SetWindowLong(m_hWnd, GWL_STYLE, style);//设置窗口类型
//移动窗口使隐藏标题栏立即生效
RECT winRect;
GetWindowRect(&winRect);//得到窗口位置
winRect.top++;//窗口上移
MoveWindow(&winRect);//移动窗口
}
}
--------------------------------------------------
12.隐藏状态栏(隐藏工具栏类似)
void CMainFrame::OnShow()
{
//判断是否状态栏可见
if(!m_wndStatusBar.IsWindowVisible())
{
//如果是不可见的,设置为可见
m_wndStatusBar.ModifyStyle(0, WS_VISIBLE);
}
//使状态栏状态生效
SendMessage(WM_SIZE);
}
void CMainFrame::OnHide()
{
//判断是否状态栏可见
if(m_wndStatusBar.IsWindowVisible())
{
//如果是可见,设置为隐藏
m_wndStatusBar.ModifyStyle(WS_VISIBLE, 0);
}
//使状态栏状态生效
SendMessage(WM_SIZE);
}
------------------------------------------------------------
13.图片 菜单
BOOL C***MDIDoc::OnNewDocument()//MDI不能在Frame中设置菜单
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
m_bitmap.LoadBitmap(IDB_BITMAP1);
CMenu *pMenu;
pMenu = CMenu::FromHandle(((CMultiDocTemplate *)m_pDocTemplate)->m_hMenuShared); // 获得文档菜单
//给菜单 文件->新建 添加图标
pMenu->GetSubMenu(0)->SetMenuItemBitmaps(0, MF_BYPOSITION, &m_bitmap, &m_bitmap);
return TRUE;
}
--------------------------------------------------------------------------
14. 添加背景图片
BOOL CBgWnd::OnEraseBkgnd(CDC* pDC) //class CBgWnd : public CWnd
{
CRect rectClient;// 客户区
CDC dcMen; // 内存设备描述表
CBitmap bmp; // 位图对象
bmp.LoadBitmap(IDB_BITMAP1);// 从资源加载位图
BITMAP tmpBitmap;
bmp.GetObject(sizeof(BITMAP), &tmpBitmap);
CSize bmpSize(tmpBitmap.bmWidth, tmpBitmap.bmHeight);// 得到位图的大小
dcMen.CreateCompatibleDC(pDC);// 创建兼容的设备描述表
CBitmap *pOld=dcMen.SelectObject(&bmp);// 选入新的位图对象并保存旧的位图对象
GetClientRect(&rectClient);// 取得客户区的大小
// 从内存向屏幕复制位图对象
pDC->StretchBlt(rectClient.left, rectClient.top, rectClient.Width(), rectClient.Height(),
&dcMen, 0, 0, bmpSize.cx, bmpSize.cy, SRCCOPY);
dcMen.SelectObject(pOld);// 恢复旧的位图对象
dcMen.DeleteDC();// 删除内存设备描述表
return true;
}
void CBgWnd::OnSize(UINT nType, int cx, int cy)
{
CWnd::OnSize(nType, cx, cy);
Invalidate();
}
在MainFrame中定义CBgWnd变量,在MainFrame::OnCreate中,
// 把m_wndBg子类化为主窗口的客户窗口
if(!m_wndBg.SubclassWindow(m_hWndMDIClient))
{
TRACE("Fail to subclass MDI client window\n");
return -1;
}
15.窗口默认 最大化(与7类似)
1.子窗口
在CChildFrame::PreCreateWindow中
cs.style = cs.style | WS_MAXIMIZE | WS_VISIBLE;
2主窗口
在APP类中,::InitInstance()中,pMainFrame->ShowWindow(SW_SHOWMAXIMIZED);
-----------------------------------------------
16 MDI默认 不创建文档
http://blog.sina.com.cn/s/blog_4c9c4e2b0100aeol.html
CXXXXXApp::InitInstance()中,cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;//
17 OnNcHitTest(不能移动的窗体)
UINT CMainFrame::OnNcHitTest(CPoint point)
{
// 截获鼠标事件
UINT returnValue = CFrameWnd::OnNcHitTest(point);
// 判断是否在拖动窗体的工具栏
if(returnValue == HTCAPTION)
{
// 如果是拖动工具栏则截获后不传递消息
return FALSE;
}
else
{
// 否则直接传递消息
return returnValue;
}
}
-------------------------------------------------------------------------------
17双击 弹出打开文档对话框
CMainFrame::OnCreate中:
// 为响应鼠标双击客户区的事件所增加的属性:CS_DBLCLKS
HWND hMDIClientArea = GetWindow(GW_CHILD)->GetSafeHwnd();
::SetClassLong(hMDIClientArea, GCL_STYLE, ::GetClassLong(hMDIClientArea,GCL_STYLE) | CS_DBLCLKS);
void CMainFrame::OnLButtonDblClk(UINT nFlags, CPoint point)
{
AfxGetApp()->m_pDocManager->OnFileOpen();
CMDIFrameWnd::OnLButtonDblClk(nFlags, point);
}
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
// 如果是在主客户区双击鼠标,则发送wm_lbuttondblclk消息
// if( pmsg->message == wm_lbuttondblclk)
//postmessage(wm_lbuttondblclk);// 发送鼠标双击消息
return CMDIFrameWnd::PreTranslateMessage(pMsg);
}
18.单选菜单
void CMainFrame::OnMenu1()
{
m_currMenu = 1; //当前选中菜单1
}
void CMainFrame::OnUpdateMenu1(CCmdUI* pCmdUI)
{
//标记菜单1
pCmdUI->SetRadio(m_currMenu == 1);
}
void CMainFrame::OnMenu2()
{
m_currMenu = 2; //当前选中菜单2
}
void CMainFrame::OnUpdateMenu2(CCmdUI* pCmdUI)
{
//标记菜单2
pCmdUI->SetCheck(m_currMenu == 2);
}
void CMainFrame::OnMenu3()
{
m_currMenu = 3; //当前选中菜单3
}
void CMainFrame::OnUpdateMenu3(CCmdUI* pCmdUI)
{
//标记菜单3
pCmdUI->SetRadio(m_currMenu == 3);
}
-=------------------------------------------------------------------
19.保存、恢复窗口信息
void CMainFrame::OnClose()
{
HKEY key; // 存放注册表键句柄
CString appKey = "Software\\WolfeLee\\SaveWinState\\Settings";// 注册表键值位置
CString keyName= "WinState";// 注册表键名
// 打开注册表并判断是否在注册表中已经有相关的键,如果没有就创建
if (RegOpenKeyEx(HKEY_CURRENT_USER, appKey, 0, KEY_WRITE, &key) != ERROR_SUCCESS)
{
DWORD disposition;// 返回创建后的信息
RegCreateKeyEx(HKEY_CURRENT_USER, appKey, 0, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, &disposition);
}
WINDOWPLACEMENT winInfo;// 窗口信息
GetWindowPlacement(&winInfo);// 获得窗口信息
// 将窗口信息保存到注册表中
RegSetValueEx(key, keyName, 0, REG_BINARY, (LPBYTE)&winInfo, sizeof(WINDOWPLACEMENT));
RegCloseKey(key);// 关闭注册表
CFrameWnd::OnClose();// 关闭窗口
}
BOOL CSaveWinStateApp::InitInstance()中:
// 以下为功能代码
HKEY key; // 存放注册表键句柄
DWORD keyType = REG_BINARY;// 键类型
DWORD keySize = sizeof(WINDOWPLACEMENT);// 键值长度
WINDOWPLACEMENT winInfo;// 窗口信息
LONG regInfo; // 注册表操作返回码
CString appKey = "Software\\WolfeLee\\SaveWinState\\Settings";// 注册表键值位置
CString keyName= "WinState";// 注册表键名
if((regInfo = RegOpenKeyEx(HKEY_CURRENT_USER, appKey, 0, KEY_READ, &key)) == ERROR_SUCCESS )
{
keyType = REG_BINARY;
keySize = sizeof(WINDOWPLACEMENT);
regInfo = RegQueryValueEx(key, keyName, 0, &keyType, (LPBYTE)&winInfo, &keySize);
RegCloseKey(key);
}
if (regInfo == ERROR_SUCCESS)
{
m_pMainWnd->SetWindowPlacement(&winInfo);
}
else
{
m_pMainWnd->ShowWindow(m_nCmdShow);
}
20.滚动条
void CXXXXXView::OnInitialUpdate()
{
......
......
// 计算整个视图的大小
sizeTotal.cx = sizeTotal.cy = 1000;
SetScrollSizes(MM_TEXT, sizeTotal);
}
21固定窗口大小
WM_GETMINMAXINFO
void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
{
// 将最小跟踪与最大跟踪设置成相同的值使窗口大小不能改变
lpMMI->ptMinTrackSize.x = 500; // 设定最小跟踪宽度
lpMMI->ptMinTrackSize.y = 400; // 设定最小跟踪高度
lpMMI->ptMaxTrackSize.x = 500; // 设定最大跟踪宽度
lpMMI->ptMaxTrackSize.y = 400; // 设定最大跟踪高度
CFrameWnd::OnGetMinMaxInfo(lpMMI);
}
22分割视图CSplitterWnd
具体见http://www.vckbase.com/document/viewdoc/?id=192
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
//创建2*2分割窗口
if(m_wndSplitter.Create(this,
2, 2,
CSize(1000, 1000), // 显示最小号20 * 20
pContext))
{
//m_wndSplitter.SetWindowPos(NULL, 200, 0, 0, 0, SWP_NOSIZE);
return TRUE;
}
else
{
TRACE0("创建切分窗体失败!");
return FALSE;
}
return CFrameWnd::OnCreateClient(lpcs, pContext);
}
23添加新的系统菜单
Frame::OnCreate中:
CMenu *pMenu = GetSystemMenu(FALSE);//得到系统菜单的指针
CString menuTitle="新菜单";//菜单标题
pMenu->AppendMenu(MF_SEPARATOR);//插入一个菜单分割符
pMenu->AppendMenu(MF_STRING, IDM_MESSAGEID, menuTitle);//添加菜单,ID随便在stringtable中新定义一个
响应WM_SYSCOMMAND
23标题栏信息
int buttonSizeX = GetSystemMetrics(SM_CXSIZE);//获得标题栏按钮宽度
int buttonSizeY = GetSystemMetrics(SM_CYSIZE);//获得标题栏按钮高度
int tilteHeight = GetSystemMetrics(SM_CYCAPTION);//获得标题栏高度
getWindowText //获得标题
24图片 工具栏
首先。CMainFrame::OnCreate中 工具栏Create时要或上(|)TBSTYLE_TRANSPARENT(第二个参数)
//加载位图图像
HBITMAP m_bmpBack = (HBITMAP)LoadImage(AfxGetInstanceHandle(),
"bg.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
// 调用此成员函数来利用Windows rebar通用控件的机能来定制rebar
CReBarCtrl& rc = m_wndReBar.GetReBarCtrl();
REBARBANDINFO info;
memset(&info,0,sizeof(REBARBANDINFO));
info.cbSize = sizeof(info);
info.fMask = RBBIM_BACKGROUND;
info.hbmBack = (m_bmpBack != INVALID_HANDLE_VALUE? m_bmpBack : NULL);
rc.SetBandInfo(0, &info);
rc.UpdateWindow(); //更新信息
25工具栏 锁定
MainFrame::Create中 注释掉
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
26窗口 置顶
// 设置当前主窗口为置顶显示
::SetWindowPos(AfxGetMainWnd()->m_hWnd, HWND_TOPMOST, -1, -1, -1, -1, SWP_NOMOVE | SWP_NOSIZE);
27打开 文件 对话框
char filter[] = "图像 (*.bmp;*.tif;*.jpg)|*.bmp;*.tif;*.jpg|Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||";
//文件对话框
CFileDialog fdlg(true, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, filter);
fdlg.m_ofn.lpstrInitialDir = "c:\\"; //设置初始文件目录
//弹出对话框,如果单击的是"OK"按钮
if(fdlg.DoModal() == IDOK)
{
//得到打开的文件的文件名
CString fileName = fdlg.GetPathName();
//将文件路径显示在对话框中
GetDlgItem(IDC_STATIC)->SetWindowText("打开文件:"+fileName);
}
28马赛卡 显示
相关:双缓冲http://www.vckbase.com/document/viewdoc/?id=1612
CScreenWnd* imageWnd = new CScreenWnd; //建立一个新窗口对象
imageWnd->CreatScreenWnd ();//创建窗口
imageWnd->CenterWindow ();//在屏幕中央
imageWnd->ShowWindow (SW_SHOW);//显示窗口
imageWnd->UpdateWindow ();//更新窗口,激活OnPait函数
if (imageWnd != NULL)
{
imageWnd->SendMessage (WM_CLOSE); //关闭窗口
}
void CScreenWnd::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
MemDC.CreateCompatibleDC(NULL);//建立一个和dc兼容的内存DC放置位图
old_bitmap=MemDC.SelectObject(&m_bitmap);//将创建的位图选入内存DC
int i,j,stepx,stepy,dispnum,x,y;
int lwf[20][20]; //数组记录已显示过的数据组
for ( i=0; i<20; i++ )
for ( j=0; j<20; j++ )
lwf[i][j]=0;
stepx=bm.bmWidth/20;
stepy=bm.bmHeight/20;
srand( (unsigned)time( NULL ) );
dispnum=0;
//记录已显示过的数据组的个数
while(1)
{ x=rand() % 20;
y=rand() % 20;
if ( lwf[x][y] ) //如果为1,则已经显示了,跳出循环。
continue;
lwf[x][y]=1; //显示,设置为1
dc.StretchBlt(
x*stepx, y*stepy,
//目标设备逻辑横、纵坐标
stepx,stepy,
//显示位图的像素宽、高度
&MemDC,
//位图内存设备对象
x*stepx, y*stepy,
//位图的起始横、纵坐标
stepx,stepy,
//位图的像素宽、高度
SRCCOPY);
dispnum++;
if ( dispnum >=400 )
break;
Sleep(10);
}
MemDC.SelectObject(old_bitmap);
// Do not call CWnd::OnPaint() for painting messages
}
29颜色对话框
COLORREF initColor = RGB(0,0,0);//初始颜色
CColorDialog dlg(0, CC_FULLOPEN, this);
if(dlg.DoModal() == IDOK)
{
initColor = dlg.GetColor();//获得颜色
}
//更改对话框背景色
CClientDC *pDC = new CClientDC(this);//客户DC
CRect rect;
GetClientRect(&rect);//得到对话框区域
CBrush brush(initColor);//初始化笔刷
pDC->FillRect(rect, &brush);//更改对话框颜色
delete pDC; //释放指针
pDC = NULL;
30.响应右键菜单
http://www.vckbase.com/document/viewdoc/?id=1923
void CContextMenuWinDlg::OnMenuCopy()
{
// TODO: Add your command handler code here
bCopy = TRUE;
}
void CContextMenuWinDlg::OnUpdateMenuPaste(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(bCopy == FALSE);
}
void CContextMenuWinDlg::OnUpdateMenuCopy(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(bCopy == TRUE);
}
void CContextMenuWinDlg::OnMenuPaste()
{
bCopy = FALSE;
}
重写OnInitMenuPopup才能使菜单更新
void CContextMenuWinDlg::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
{
CDialog::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
// TODO: Add your message handler code here
int nCount = pPopupMenu->GetMenuItemCount();
CCmdUI cmd;//创建自动更新类
cmd.m_pMenu = pPopupMenu;
cmd.m_nIndexMax = nCount;//MSDN上未介绍的成员变量
for (int i = 0; i < nCount; i ++)
{
UINT nID = pPopupMenu->GetMenuItemID(i);
if (nID != 0)//如果不是分隔符
{
cmd.m_nIndex = i;
cmd.m_nID = nID;
cmd.DoUpdate(this, TRUE);//MSDN上未介绍的成员函数,可以找到自动更新宏,传入CCmdUI指针,来执行自动更新
}
}
}
31.拖动 无边框 对话框
UINT CXXXDlg::OnNcHitTest(CPoint point)
{
//截获鼠标事件
UINT nHitTest = CDialog::OnNcHitTest(point);
// 判断是否在拖动客户区,如果是则发送拖动标题栏的消息
return (nHitTest == HTCLIENT)? HTCAPTION : nHitTest;
}
32.对话框 形状
初始化时:
GetClientRect(&Rect);
// 设置椭圆形窗体区域
newRgn.CreateEllipticRgn(0,0,Rect.Width(),Rect.Height());
::SetWindowRgn(this->m_hWnd,(HRGN)newRgn,TRUE);
33.查找 替换 对话框
CFindReplaceDialog* pDlg = new CFindReplaceDialog; //定义查找替换对话框指针
pDlg->Create(false, 0, 0, FR_DOWN, this); //创建
如下是创建一个查找窗口的实例:
CFindReplaceDialog *pFindDlg = new CFindReplaceDialog; // 由于是非模态对话框这里用new命令分配内存
if (!pFindDlg->Create(TRUE,_T( "hyp's Knowledge Base"), NULL,FR_DOWN|FR_MATCHCASE|FR_WHOLEWORD , this)) //上面说明了
{
return;
}
pFindDlg->ShowWindow(SW_SHOW); //窗口创建完毕要显示出来
pFindDlg->SetActiveWindow(); //设置为活动窗口
如下是创建一个查找替换窗口的实例:
CFindReplaceDialog *pReplaceDlg= new CFindReplaceDialog;
if(!pReplaceDlg->Create(FALSE,_T( "hyp"),_T( "hyp's Knowledge Base"),FR_DOWN, this))
{
return;
}
pReplaceDlg->ShowWindow(SW_SHOW);
pReplaceDlg->SetActiveWindow();
显示的出来的对话框还需要添加一些响应函数吧,我找了一下发现没有现成的消息响应-_-网上google了一下发现要自己添加我汗.
大体步骤是这样子的:
在你添加查找替换对话框的头文件的#pragma once下面加入
const int WM_FINDREPLACE = ::RegisterWindowMessage(FINDMSGSTRING); //将FINDMSGSTRING注册为WM_FINDREPLACE消息
并在头文件生成的消息映射函数
afx_msg LONG OnFindReplace(WPARAM wParam, LPARAM lParam);
在源文件里面将消息映射函数与WM_FINDREPLACE消息关联
BEGIN_MESSAGE_MAP(...)
...
ON_REGISTERED_MESSAGE(WM_FINDREPLACE, OnFindReplace)
...
END_MESSAGE_MAP()
接下来编写OnFindReplace函数就OK了
LONG ChypDlg::OnFindReplace( WPARAM wparam, LPARAM lparam )
{
// TODO: 在此添加控件通知处理程序代码
CFindReplaceDialog* pDlg = CFindReplaceDialog::GetNotifier(lparam);
//具体查找替换代码就自己编写
// pDlg->GetFindString(); 该函数可以返回查找字符串
// pDlg->GetReplaceString(); 该函数可以返回查找替换串
//pDlg->SearchDown(); 该函数可以判断是向上还是向下搜索,TRUE是向下,反之OOXX
//pDlg->MatchCase(); 该函数可以判断是否区分大小写
//pDlg->MatchWholeWord(); 该函数可以判断是否全字匹配
if( pDlg != NULL )
{
if( pDlg->FindNext() )
{
MessageBox( "FindNext!", "hyp's Knowledge Base" ,MB_OK);
}
else
if( pDlg->ReplaceAll() )
{
MessageBox( "ReplaceAll!", "hyp's Knowledge Base", MB_OK);
}
else
if( pDlg->ReplaceCurrent() ){
MessageBox( "ReplaceCurrent!", "hyp's Knowledge Base", MB_OK);
}
}
delete pDlg; //加上这个点击完毕以后会自动销毁对话框
return 1;
} 34.设置字体 void CFontSetDlg::OnButton1()
{
CFontDialog dlg; //字体对话框
dlg.m_cf.lpLogFont = &m_font; //字体
dlg.m_cf.rgbColors = m_textColor; //颜色
dlg.m_cf.Flags |= CF_INITTOLOGFONTSTRUCT;
if(dlg.DoModal() == IDOK)
{
dlg.GetCurrentFont(&m_font); //得到字体
m_textColor = dlg.GetColor(); //得到颜色
CFont font;
font.CreateFontIndirect(&m_font);
GetDlgItem(IDC_STATIC)->SetFont(&font, true); //设置控件字体
}
}
//控件颜色,如果不是每次都改变,只需要写在initaildialog中一次
HBRUSH CFontSetDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) //WM_CTLCOLOR
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
//如果控件是IDC_STATIC
if (pWnd->GetDlgCtrlID() == IDC_STATIC)
{
//设置控件颜色
m_textColor = RGB(255,0,0);
pDC->SetTextColor(m_textColor);
pDC->SetBkColor(m_textColor);
pDC->SetBkMode(TRANSPARENT);
}
return hbr;
}
35 CFileDialogEX 自定义 继承 CFileDialog
CFileDialogEx::CFileDialogEx(BOOL bOpenFileDialog, LPCTSTR lpszDefExt, LPCTSTR lpszFileName,
DWORD dwFlags, LPCTSTR lpszFilter, CWnd* pParentWnd) :
CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags, lpszFilter, pParentWnd)
{
//这个四个常用标识位
m_ofn.Flags |= OFN_EXPLORER | OFN_ENABLEHOOK | OFN_ENABLETEMPLATE |OFN_HIDEREADONLY;
m_ofn.lpstrTitle = _T("打开图片预览对话框");
m_ofn.hInstance = AfxGetInstanceHandle();
m_ofn.lpstrFilter = _T("图像(.bmp;.tif;.jpg)\0*.bmp;*.tif;*.jpg\0所有文件\0*.*\0 ");
m_ofn.lpTemplateName = MAKEINTRESOURCE(IDD_DIALOG_HOOK);
m_ofn.lpfnHook = (LPOFNHOOKPROC)ComDlgPreviewProc;
}
void CFileDialogEx::ShowImagepreview(HWND hDlg, char *ImagePath)
{
// CString strTemp;
RECT rect;
//如果用的是Win32的SDK,前面要加::
HDC hDC = ::GetDC(::GetDlgItem(hDlg, IDC_PIC)); //Get the DC for the CPicture Box
::GetClientRect(::GetDlgItem(hDlg, IDC_PIC), &rect); //Get dimensions of it
CPicture pic;
//Try to load the Image..if not then we should return
if(!pic.LoadPicture(ImagePath))
return;
//set the width & height labels
::SetDlgItemInt(hDlg, IDC_WIDTH, pic._GetWidth(), FALSE);
::SetDlgItemInt(hDlg, IDC_HEIGHT, pic._GetHeight(), FALSE);
//Draw the image in the picture box
//(could be updated to maintain aspect ratio)
pic.DrawPicture(hDC, 0, 0, rect.right - rect.left ,rect.bottom - rect.top );
::ReleaseDC(::GetDlgItem(hDlg, IDC_PIC), hDC);
}
LRESULT CALLBACK ComDlgPreviewProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG: //初始化对话框上的控件
if(SendDlgItemMessage(hDlg, IDC_SHOWPREVIEW, BM_GETCHECK, 0, 0) == BST_UNCHECKED)
{
HWND hWnd;
hWnd = GetDlgItem(hDlg, IDC_PIC);
::SetWindowText(hWnd, "\n\n\n\n 点击图象文件进行预览!");
}
break;
case WM_DESTROY: //消毁对话框
{
LPOPENFILENAME lpOFN = (LPOPENFILENAME)GetWindowLong(hDlg, DWL_USER);
}
break;
case WM_COMMAND: //这里处理,IDC_SHOWPREVIEW命令
if ((HIWORD(wParam) == BN_CLICKED) && (LOWORD(wParam) == IDC_SHOWPREVIEW))
{
if(SendDlgItemMessage(hDlg, IDC_SHOWPREVIEW, BM_GETCHECK, 0, 0) == BST_CHECKED)
{
InvalidateRect(GetDlgItem(hDlg, IDC_PIC), NULL, FALSE);
::SetDlgItemInt(hDlg, IDC_WIDTH, 0, FALSE);
::SetDlgItemInt(hDlg, IDC_HEIGHT, 0, FALSE);
}
}
//不选中,
if(SendDlgItemMessage(hDlg, IDC_SHOWPREVIEW, BM_GETCHECK,0,0) == BST_CHECKED)
{
HWND hWnd;
hWnd = GetDlgItem(hDlg, IDC_PIC);
::SetWindowText(hWnd, "\n\n\n\n 点击图象文件进行预览!");
}
//选中
if(SendDlgItemMessage(hDlg, IDC_SHOWPREVIEW, BM_GETCHECK,0,0) != BST_UNCHECKED)
{
HWND hWnd;
hWnd = GetDlgItem(hDlg, IDC_PIC);
::SetWindowText(hWnd, "\n\n\n\n 处于非预览状态!");
}
if(LOWORD(wParam) == IDOK)
{
}
break;
case WM_NOTIFY:
HandleNotify(hDlg, (LPOFNOTIFY)lParam);
default:
return FALSE;
}
return TRUE;
}
//这里处理notify 消息
BOOL NEAR CALLBACK HandleNotify(HWND hDlg, LPOFNOTIFY pofn)
{
CFileDialogEx dlg(TRUE);
switch (pofn->hdr.code)
{
case CDN_SELCHANGE:
{
char szFile[MAX_PATH];
// Get the path of the selected file.
if (CommDlg_OpenSave_GetFilePath(GetParent(hDlg), szFile, sizeof(szFile)) <= sizeof(szFile))
{
if(GetFileAttributes(szFile) != FILE_ATTRIBUTE_DIRECTORY)
{
//Should we load the Pic
if(SendDlgItemMessage(hDlg, IDC_SHOWPREVIEW, BM_GETCHECK,0,0) == BST_UNCHECKED)
dlg. ShowImagepreview(hDlg, szFile);
}
}
}
break;
case CDN_FILEOK:
return FALSE;
break;
}
return(TRUE);
}