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->hwnd == m_hwndmdiclient &&*/ 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);
/* CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP3);
HBITMAP m_bmpBack=(HBITMAP)bitmap;*/
// 调用此成员函数来利用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);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值