天天看点

VC小例子(整理)

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);

}

继续阅读