 |
请问怎样使用CMFCToolBar?
|
|
| |
| 怎样用这个类为程序添加多个自定义工具栏?谢谢!
|
|
| 作者:phili phili张贴于2008-09-05 01:52:13.0,共阅读233次,回复0次 |
|
|
 |
绘制桌面精灵
|
|
| |
| 如此临时创建的区域,由于计算需要很多的时间,所以使得有点闪烁。改进的方法有:
1、利用屏蔽位图进行处理,可以加快时间
2、如果精灵动作不是特别多,图片不是特别大的情况下,直接将所有创建的区域保存下来,不用每次都来创建和删除,这样将快很多,但是也消耗更多的内存。// 关键在于如何创建一个随意形状的窗口
准备一张带有透明色背景(就是背景都是一个颜色,呵呵)的bmp图片
创建与位图兼容的dc。然后创建一个空区域
hr=CreateRectRgn(0,0,0,0);
for (i=0;i < 图片宽度-2;i++)
{
for(j = 0;j< 图片高度-2;j++)
{
用dc得到图片i,j处的象素pixel
if( pexel !=透明色)
{
temp=CreateRectRgn(i,j,i+1,j+1);
CombineRgn(hr,hr,temp,RGN_OR);
DeleteObject(temp);
}
// 最后用SetWindowRgn函数将窗口形状设置成上面创建的区域的形状
SetWindowRgn(handle,hr,true);
DeleteObject(hr);
ps:如果有与位图相对应的屏蔽位图,用他们进行光栅 ...
|
|
| 作者:不祥 ISeekYou张贴于2004-05-13 14:55:04.0,共阅读2724次,回复2次 |
|
|
 |
全屏显示视图的代码
|
|
| |
| 开启全屏显示的代码:
void CViewerFrame::FullScreenShow()
{
GetWindowPlacement(&m_OldWndPlacement);
CRect WindowRect;
GetWindowRect(&WindowRect);
CRect ClientRect;
RepositionBars(0,0xffff,AFX_IDW_PANE_FIRST,reposQuery,&ClientRect);
ClientToScreen(&ClientRect);
int nFullWidth=GetSystemMetrics(SM_CXSCREEN);
int nFullHeight=GetSystemMetrics(SM_CYSCREEN);
m_FullScreenRect.left=WindowRect.left-ClientRect.left-1;
m_FullScreenRect.top=WindowRect.top-ClientRect.top-1;
m_FullScreenRect.right=WindowRect.right-ClientRect.right+nFullWidth+2;
m_FullScreenRect.bottom=WindowRect.bottom-Clie ...
|
|
| 作者:不祥 bluejoe张贴于2004-04-24 21:26:56.0,共阅读2925次,回复3次 |
|
|
 |
CListCtrl与CListView相关代码
|
|
| |
| 选择项的问题
双击响应函数里的参数有一个是NM_LISTVIEW *
msdn查NMLISTVIEW(把中间那个_去掉)能看到这个结构中有一个成员变量是iItem
0表示第一行,1表示第二行;还有一个iSubItem表示列,0表示双击在第一列
CListCtrl大小图标转换
先要添加控制按纽(大图标,小图标,列表,详细)
void OnBig()
{ LONG lStyle;
lStyle = GetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE);//获取当前窗口句并
lStyle&=~ LVS_TYPEMASK;//清除显示方式所在的比特为
lStyle |= LVS_ICON;//设置显示方式
SetWindowLong(m_listCtrl.m_hWnd, GWL_STYLE,lStyle);//设置窗口类型 ...
|
|
| 作者:不祥 jerry张贴于2004-03-10 18:19:36.0,共阅读4730次,回复1次 |
|
|
 |
【转】设置窗口的透明度
|
|
| |
| ...
设置窗口的透明度(win2000以上)
-----------------------------------
第一步 定义功能
typedef BOOL (FAR PASCAL * FUNC1)(
HWND hwnd, // handle to the layered window
COLORREF crKey, // specifies the color key
BYTE bAlpha, // value for the blend function
DWORD dwFlags // action
);
第二步 实现代码
在OnInitDialog中加入下列代码(如果在SDI里面,应该是在OnCreat里面添加)
.....
HMODULE hModule = GetModuleHandle("user32.dll");
FUNC1 SetLayeredWindowAttributes;
SetLayeredWindowAttributes = (FUNC1) GetProcAddress (hModule, _T( "SetLayeredWindowAttributes" ) );
// 设置分层扩展标记
SetWindowLong(GetSafeHwnd(), ...
|
|
| 作者:ohahay ohahay张贴于2007-12-28 19:19:31.0,共阅读991次,回复0次 |
|
|
 |
如何得到系统帮助手型鼠标形状
|
|
| |
| HCURSOR LoadHelpCursor()
{
CString strWndDir;
GetWindowsDirectory(strWndDir.GetBuffer(MAX_PATH), MAX_PATH);
strWndDir.ReleaseBuffer();
strWndDir += _T("\\winhlp32.exe");
HMODULE hModule = LoadLibrary(strWndDir);
HCURSOR hCursor=NULL;
if (hModule)
{
hCursor = ::LoadCursor(hModule, MAKEINTRESOURCE(106));
FreeLibrary(hModule);
}
return hCursor;
}
|
|
| 作者:不祥 xler张贴于2004-05-11 15:04:02.0,共阅读2510次,回复2次 |
|
|
 |
URL链接的显示--CHyperLink
|
|
| |
| Copyright Chris Maunder, 1997
用以显示可点击的URL链接,使用方法如下:
CHyperLink m_Url; //static控件映射变量
m_Url.SetURL("");
m_Url.SetCursor(::theApp.LoadStandardCursor (IDC_HAND));
m_Url.SetToolTip(_T("访问VCer.net网站"));头文件:
// HyperLink.h : header file
//
//
// HyperLink static control. Will open the default browser with the given URL
// when the user clicks on the link.
//
// Copyright Chris Maunder, 1997
// Feel free to use and distribute.
#if !defined(AFX_HYPERLINK_H__D1625061_574B_11D1_ABBA_00A0243D1382__INCLUDED_)
#define AFX_HYPERLINK_H__D1625061_574B_11D1_ABBA_00A0243D1382__INCLUDED_
#if ...
|
|
| 作者:Chris Maunder bluejoe张贴于2007-01-17 17:16:23.0,共阅读2598次,回复1次 |
|
|
 |
如何在对话框中加入状态栏[2]加强你的状态栏
|
|
| |
| 1.修改状态栏背景色
OnInitDialog 里面加 m_bar.GetStatusBarCtrl().SetBkColor(RGB(180,180,180));
2.时间显示
OnInitDialog 里面加 SetTimer(100,1000,NULL);
WM_TIMER 里面
if(nIDEvent==100)
{
CTime t1;
t1=CTime::GetCurrentTime();
m_bar.SetPaneText(1,t1.Format("%H:%M:%S"));
}
CDialog::OnTimer(nIDEvent);
3.显示鼠标坐标
void CDlgStatusBarDlg::OnMouseMove(UINT nFlags, CPoint point)
{
CString s;
s.Format("X=%d Y=%d",point.x,point.y);
m_bar.SetPaneText(0,s);
CDialog::OnMouseMove(nFlags, point);
}
要看前面一片文章哦
|
|
| 作者:不祥 Bccv张贴于2004-04-20 11:54:48.0,共阅读2901次,回复1次 |
|
|
 |
CListCtrl的item checked 或unchecked时的消息响应
|
|
| |
| void CListDlg::OnItemchangedlist(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
*pResult = 0;
if (pNMListView->uOldState == 0 && pNMListView->uNewState == 0)
return; // No change
BOOL bPrevState = (BOOL)(((pNMListView->uOldState &
LVIS_STATEIMAGEMASK)>>12)-1); // Old check box state
if (bPrevState < 0) // On startup there's no previous state
bPrevState = 0; // so assign as false (unchecked)
// New check box state
BOOL bChecked=(BOOL)(((pNMListView->uNewState & LVIS_STATEIMAGEMASK)>>12)-1);
if (bChecked < 0) // On n ...
|
|
| 作者:不祥 jerry张贴于2004-05-27 16:41:30.0,共阅读2896次,回复0次 |
|
|
 |
给IE窗口的Input框右键菜单加入新的功能
|
|
| |
| 部分内容需要参考上面的,为Edit框右键菜单添加新项
和设置Edit窗口一样,也需要设置一个窗口过程钩子来截获WM_CONTEXTMENU消息,不过设置的窗口过程有所不同。新的窗口过程如下:
LRESULT CALLBACK IEWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HOOKSHARED *hkShared;
HANDLE hMapObject;
WNDPROC oldWndProc = (WNDPROC)::GetProp(hWnd, ADPISA_oldProc);
hkShared = HooKGetSharedMem(&hMapObject);
if( uMsg == hkShared->uIEDoPaste )
{
POINT pt;
pt.y = HIWORD( lParam );
pt.x = LOWORD( lParam );
IEDoPaste(hWnd,pt);
}
HooKReleaseSharedMem(hkShared,hMapObject);
switch(uMsg)
{
case WM_CONTEXTMENU:
{
// 在右键弹出时,判断是否为Input框,主要函数GetD ...
|
|
| 作者:不祥 ISeekYou张贴于2004-05-21 21:46:37.0,共阅读2546次,回复0次 |
|
|
 |
给Edit编辑窗口的右键菜单加入新的功能
|
|
| |
| 代码内容来自于曾经做过的一个个人电脑安全安全处理助理软件,其中有项功能,就是给正在编辑的窗口内容加密,加密的功能放在右键菜单中调用,呵呵。里面有些用到的结构函数并没有列出来,代码只能大致给出思路首先需要安装一个窗口过程钩子
g_hPROCHook=SetWindowsHookEx(WH_CALLWNDPROC, GetMsgProc, g_hinstDll, 0);
窗口过程主要是在截获到 WM_CONTEXTMENU 消息时,判断当前窗口是否为Edit框, 若是的话,保存原窗口过程,设置新的窗口过程为NormalWndProc。
LRESULT WINAPI GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)
{
CWPSTRUCT* pStruct = (CWPSTRUCT*)lParam;
HOOKSHARED *hkShared;
HHOOK hProcHook;
HANDLE hMapObject;
hkShared=HooKGetSharedMem(&hMapObject);
hProcHook=hkShared->g_hPROCHook;
if (nCode == HC_ACTION)
{
if (pStruct->message != WM_CONT ...
|
|
| 作者:不祥 ISeekYou张贴于2004-05-21 21:24:50.0,共阅读2549次,回复0次 |
|
|
 |
实现Dialog的Menu中最近使用文件机制
|
|
| |
| l 如何启动Dialog的Command Update机制?
重载Cdialog的WM_INITMENUPOPUP, 修改使用 void CFrameWnd::OnInitMenuPopup (CMenu* pMenu, UINT, BOOL bSysMenu)
中的source code,启动Command Update机制
l 如何实现Dialog的Menu中最近使用文件机制?
最近使用文件机制是用CWinApp的Command Update机制和以下两个消息处理的:
ON_UPDATE_COMMAND_UI(ID_FILE_MRU_FILE1, OnUpdateRecentFileMenu)
ON_COMMAND_EX_RANGE(ID_FILE_MRU_FILE1,ID_FILE_MRU_FILE16, OnOpenRecentFile)
void CWinApp::OnUpdateRecentFileMenu(CCmdUI* pCmdUI)
{
ASSERT_VALID(this);
if (m_pRecentFileList == NULL) // no MRU files
pCmdUI->Enable(FALSE);
...
|
|
| 作者:不祥 jerry张贴于2004-05-11 20:37:18.0,共阅读2488次,回复0次 |
|
|
 |
如何实现双击程序托盘图标弹出或者弹入动画效果
|
|
| |
| 使用API:
BOOL WINAPI DrawAnimatedRects(HWND hwnd, int idAni, CONST RECT * lprcFrom, CONST RECT * lprcTo);
Eg:
Bool m_bShow = false; //区分弹出还是弹入
BOOL WinAnimation()
{
CWnd * pWnd=FindWindow("Shell_TrayWnd",NULL); //windows底部信息提示窗口
if(!pWnd)return FALSE;
CRect rectSur,rectDst;
GetWindowRect(&rectSur); //本窗口大小,用户自己处理
EnumChildWindows(pWnd->GetSafeHwnd(),My_Find,(LPARAM)&rectDst); //寻找托盘
if(m_bShow)DrawAnimatedRects(GetSafeHwnd(),IDANI_CAPTION,&rectSur,&rectDst); //弹入
else DrawAnimatedRects(GetSafeHwnd(),IDANI_CAPTION,&rectDst,&rectSur); //弹出
re ...
|
|
| 作者:不祥 xler张贴于2004-05-11 14:47:50.0,共阅读2338次,回复0次 |
|
|
 |
分割“品”字型的视图
|
|
| |
| BOOL CBrowserFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
m_Splitter1.CreateStatic(this,1,2);
m_Splitter2.CreateStatic(&m_Splitter1,2,1,WS_CHILD|WS_VISIBLE,m_Splitter1.IdFromRowCol(0,1));
m_Splitter1.CreateView(0,0,RUNTIME_CLASS(CBrowserFolder),CSize(200,0),pContext);
m_Splitter2.CreateView(0,0,RUNTIME_CLASS(CLogoBar),CSize(0,80),pContext);
m_Splitter2.CreateView(1,0,RUNTIME_CLASS(CBrowserList),CSize(0,0),pContext);
return CFrameWnd::OnCreateClient(lpcs,pContext);
}
|
|
| 作者:不祥 bluejoe张贴于2004-04-30 10:16:05.0,共阅读1906次,回复0次 |
|
|
 |
如何在对话框中加入状态栏[1]
|
|
| |
| 1.ID_INDICATOR_NISH and ID_INDICATOR_TIME这个两个加到 symbol 里去,同样的加到 string table 里去
2.在你的 Dialog 类里面加个 CStatusBar m_bar;
3.在实现文件开头加上
static UINT BASED_CODE indicators[] =
{
ID_INDICATOR_NISH,
ID_INDICATOR_TIME
};
4.OnInitDialog 里面加上
m_bar.Create(this); //We create the status bar
m_bar.SetIndicators(indicators,2); //Set the number of panes
CRect rect;
GetClientRect(&rect);
//Size the two panes
m_bar.SetPaneInfo(0,ID_INDICATOR_NISH,
SBPS_NORMAL,rect.Width()-100);
m_bar.SetPaneInfo(1,ID_INDICATOR_TIME,SBPS_STRETCH ,0);
//This is where we actually draw ...
|
|
| 作者:不祥 Bccv张贴于2004-04-20 11:46:50.0,共阅读2255次,回复0次 |
|
|
 |
在工具条中加入组合框控件
|
|
| |
| 昨天在 smth 有人问,说下.大家多指教
首先打开VC的工具条资源编辑器,如图一所示,在要加入组合框的地方加一个空按纽,如图一所示的第四个按纽,分配一个ID号,在本文的实例中为IDC_COMBOX。
工具条应该封装为一个类,组合框控件应该作为这个类的一个成员变量。生成一个以CToolBar为基类的的新类CComboToolBar,这可以用VC的类向导(ClassWizard)来实现,先生成一个以CToolBarCtrl为基类的新类CComboToolBar,然后在文件编辑器中打开ComboToolBar.h和ComboToolBar.cpp文件,把CComboToolBar基类改为CToolBar。新类生成后,加入成员变量CComboBox m_combobox。
然后把CMainFrame类中的工具条成员变量m_wndToolBar的类型由CToolBar改为CComboToolBar。编辑应用程序向导已经生成好的函数int CMainFrame::OnCreate (LPCREATESTRUCT lpCreateStruct),这个函数通常用来产生工具条和状态条,在创建工具条的函数后加入以下代码:
CRect rect;
//设置组合框的宽度,四个参数依次为控件在工具条中的索引号、ID号、风格、宽度
m_wndToolBar.SetButtonInfo ...
|
|
| 作者:不祥 Bccv张贴于2004-04-16 09:10:08.0,共阅读2428次,回复1次 |
|
|
 |
如何改变控件的字体 (老问题,好解决)
|
|
| |
| 由于控件是也是窗口,用户可以调用CWnd: : SetFont指定新字体。
//Declare font object in class declaration (.H file ).
private :
Cfont m_font ;
// Set font in class implementation (.Cpp file ). Note m_wndButton is a
//member variable added by ClassWizard.DDX routines hook the member
//variable to a dialog button contrlo.
BOOL CSampleDialog : : OnInitDialog ( )
¡­
//Create an 8-point Arial font
m_font . CreateFont (MulDiv (8 , -pDC-> GetDeviceCaps (LOGPIXELSY) , 72).
0 , 0 , 0 , FW_NORMAL , 0 , 0, 0, ANSI_CHARSER, OUT_STROKE_PRECIS ,
CLIP_STROKE _PRECIS , DRA ...
|
|
| 作者:不祥 Bccv张贴于2004-04-16 09:00:25.0,共阅读2415次,回复1次 |
|
|
 |
也贴一个显示选择目录文件夹的片断
|
|
| |
| 和 bluejoe 一样的差不多..BROWSEINFO browseInfo;
browseInfo.hwndOwner = this->m_hWnd;
// set root at Desktop
browseInfo.pidlRoot = NULL;
browseInfo.pszDisplayName = "hehe";
browseInfo.lpszTitle = "Paht";
browseInfo.ulFlags = BIF_RETURNFSANCESTORS|BIF_RETURNONLYFSDIRS;
browseInfo.lpfn = NULL;
browseInfo.lParam = 0;
LPITEMIDLIST lpItemIDList;
if ((lpItemIDList = ::SHBrowseForFolder(&browseInfo))
!= NULL)
{
// Get the path of the selected folder from the item ID list.
if (::SHGetPathFromIDList(lpItemIDList, szBuffer))
{
// At this point, szBuffer contains the path the user chose. ...
|
|
| 作者:不祥 Bccv张贴于2004-04-16 08:38:18.0,共阅读1975次,回复0次 |
|
|
 |
发送一个关于某个按钮单击的消息
|
|
| |
| GetDlgItem(IDOK)->PostMessage(BM_CLICK,0,0);
或
PostMessage(WM_COMMAND,IDOK|BN_CLICKED<<16,GetDlgItem(IDOK)->m_hWnd);
|
|
| 作者:不祥 jerry张贴于2004-03-10 21:08:28.0,共阅读1878次,回复0次 |
|
|
 |
多行文本输出
|
|
| |
| int CUtil::MultiLineTextOut(
CDC * pDC,
int x,
int y,
CString Text,
int LineSpace)
{
TEXTMETRIC Metric;
if (pDC->GetOutputTextMetrics(& Metric))
{
LineSpace += Metric.tmHeight;
}
int Lines = 0;
int Length = Text.GetLength();
int Start = 0;
for (int i = 0; i < Length; i++)
{
if (Text.GetAt(i) == '\n')
{
Lines++;
pDC->TextOut(x, y, Text.Mid(Start, i - Start));
y += LineSpace;
Start = i + 1;
}
}
pDC->TextOut(x, y, Text.Mid(Start, i - Start));
return Lines;
}
|
|
| 作者:不祥 bluejoe张贴于2004-03-10 14:51:56.0,共阅读2048次,回复0次 |
|
|
|