积木

No sub title

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  140 Posts :: 1 Stories :: 11 Comments :: 0 Trackbacks

常用链接

留言簿(1)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

#

注意:刚刚试了下,似乎没法响应。改日再行研究。或高手们还请不吝赐教。

 ClientToScreen(&point);
 theApp.GetContextMenuManager()->ShowPopupMenu(IDR_MENU_OBJECTMGR, point.x, point.y, this, TRUE);

说明一点:
1) 如果有用dockpane的话,则菜单控制需要在wm_rbuttondown中处理
2) 用上面的方法,弹出来的右键菜单,将是灰的,而且就算你已经为它们写了消息响应。它们也是灰的。(但请注意:此时的菜单项,虽是
灰的,可它们是可以点击的。即:它们是可以响应的。)
要想解决菜单项灰的问题。可以用如下方法解决。
步骤一:
 CMenu rMenu;
 rMenu.LoadMenu(IDR_MENU_OBJECTMGR);
 CMenu* pPopupMenu = rMenu.GetSubMenu(0);
 ClientToScreen(&point);
 pPopupMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTALIGN, point.x, point.y, this);

上面的代码其实是我们非常熟悉的处理方法。但用上它,vs2008中的皮肤效果将无法显示出来。
所以需要下面的步骤二。
步骤二:
不用上面的 pPopupMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTALIGN, point.x, point.y, this);
将其改为:GetContextMenuManager()->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTALIGN, point.x, point.y, this);
此时就万事OK了。

-----------------------------------------------
总结:vs2008在皮肤以及一些新的功能特性方面,的确给我们带来了不少的惊奇。可同时,也给我们带来了不少的"麻烦"。
posted @ 2011-11-03 14:03 Jacc.Kim 阅读(455) | 评论 (0)编辑 收藏

VS2008创建的单文档应用程序,其默认的菜单栏字体与工具栏字体都偏小。具体原因,mao似是微软在vs2008上,对字体的大小有设置过(有多写了几行代码)
下面是一种解决办法:
在CXxxxxApp::InitInstance()处,添加如下代码:

 LOGFONT logfont = {0};
 ::SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &logfont, 0);
 afxGlobalData.SetMenuFont(&logfont, true);
posted @ 2011-11-03 11:48 Jacc.Kim 阅读(939) | 评论 (0)编辑 收藏

以下代码是将指定目录或文件 lpcszResPath 添加到指定的 pParentItem 树节点下。(如果 lpcszResPath 是一目录,则递归其所有子目录及文件)
代码如下:
void CLocalResourceView::Add(HTREEITEM pParentItem /* = NULL */const char* lpcszResPath /* = NULL */)
{
    
if (!::PathFileExists((LPCTSTR)lpcszResPath))
        
return ;
    
char szName[MAX_PATH] = { '\0' };
    GLOBALFUNCTION::GetNameByPath(lpcszResPath, szName);

    HTREEITEM hItem 
= NULL;
    
if (PathIsDirectory((LPCSTR)lpcszResPath))
        hItem 
= m_wndLocalResTree.InsertItem(szName, 00, pParentItem, NULL);
    
else
        hItem 
= m_wndLocalResTree.InsertItem(szName, 22, pParentItem, NULL);

    
if (PathIsDirectory((LPCSTR)lpcszResPath))
    {
        
//* 末尾添加上斜杠
        GLOBALFUNCTION::IncludeDirTailSlash(lpcszResPath, szName);
        
string strPath(szName);
        
string strTemp("");

        HANDLE hSearch;
        WIN32_FIND_DATA data;
        strTemp 
= strPath + "*.*";
        hSearch 
= FindFirstFile(strTemp.c_str(), &data);
        
if (INVALID_HANDLE_VALUE != hSearch)
        {
            
do 
            {
                
if (!strcmp(data.cFileName, "."|| !strcmp(data.cFileName, ".."))
                    
continue;
                strTemp 
= strPath + data.cFileName;
                
this->Add(hItem, strTemp.c_str());
            } 
while (FindNextFile(hSearch, &data));
            FindClose(hSearch);
        }
    }
}


posted @ 2011-10-21 11:52 Jacc.Kim 阅读(492) | 评论 (0)编辑 收藏

在窗口的OnCreate响应中,添加:
DragAcceptFiles(TRUE);

接着响应ONDROPFILES消息。在响应中添加如下方法:


 //hDropInfo是指向含有被拖放的文件名的结构体的句柄
 char szFilePathName[_MAX_PATH + 1] = {0};
 //函数原型:UINT DragQueryFile(HDROP hDrop, UINT iFile, LPTSTR lpszFile, UINT cch)
 //当iFile为0xFFFFFFFF时,后面两个参数忽略,并返回拖放文件的个数
 UINT nNumOfFiles = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);

 //循环处理拖放的多个文件
 for (UINT nIndex=0; nIndex < nNumOfFiles; nIndex++)
 {
  DragQueryFile(hDropInfo, nIndex, (LPTSTR)szFilePathName, _MAX_PATH);
  //通过文件路径,做文件处理的那些事
  MessageBox((LPTSTR)szFilePathName);
 }

 DragFinish(hDropInfo);//拖放操作完成,释放用来传输文件名的内存

posted @ 2011-10-20 21:26 Jacc.Kim 阅读(625) | 评论 (0)编辑 收藏

Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics

Public Module Module1

    Sub EX_GeneralGUID()
        '' General a guid string
        ''
        Dim strGUID As String
        strGUID = System.Guid.NewGuid.ToString()
        strGUID = UCase(strGUID.Replace("-", "_"))

        ActiveDocument.Selection.text = strGUID
    End Sub
End Module

posted @ 2011-10-08 17:57 Jacc.Kim 阅读(752) | 评论 (0)编辑 收藏

1) 关于10进制、8进制、16进制的常量:
      常规写法,就表示10进制;
      以数字0开头的写法,表示8进制;
      以数字0加上小写字母x开头的,表示16进制;
举例如下:数字20的以上三种表示法:
      10进制表示法:20
      8进制表示法:024
      16进制表示法:0x14

2)  在常量后面跟上字母"U"或"u"(即:大小写的U)时,表示unsigned类型
3) 在常量后面跟上字母"L"或"l"(即:大小写的L)时,表示长整型,即:long
关于2) 与 3) 举例
      128u   //* 表示unsigned      //* 当然此处也可以用大写的U
      128L   //* 表示long             //* 当然此处也可以用小写的l
      128LU //* 表示unsigned long       //* 当然此处也可以用128LU

4) 关于浮点数的常量:
      在小数常量后面加上F或f,表示该常量为一单精度常量
      如果在小数常量后面加上L或l,表示扩展精度(一种比单精度再精确的浮点数类型)

5) 布尔常量,有且仅有两种:true与false

6) 关于char与wchar_t类型的字符常量
      char 类型的常量,是指:用两个单引号括起来的单个字符,即为char型常量。
      如果在单引号的前面加上大写字母L,则可表示wchar_t类型的常量。
注释:wchar_t是指一种宽字节类型。比如,有时候项目中可能就需要处理一些unicode或中文汉字之类的字符时,就需要用到它。
举例如下:
      'a'         L'a'//wchar_t
posted @ 2011-10-06 21:05 Jacc.Kim 阅读(396) | 评论 (0)编辑 收藏

声明进度条对象
CProgressCtrl m_wndProgress;
创建按钮对象

 //* 进度条
 CRect rectClient;
 rectClient.left = 10;
 rectClient.top = 10;
 rectClient.right = 200;
 rectClient.bottom = 18;

 if (!m_wndProgress.Create(WS_CHILD | WS_VISIBLE | PBS_SMOOTH, rectClient, this, 6))
 {
  TRACE0("Failed to create progress control.");
  return -1;
 }


 m_wndProgress.SetRange(0, 100);
 m_wndProgress.SetPos(37);
 m_wndProgress.SetStep(0);
 m_wndProgress.StepIt();
 
 m_wndProgress.ShowWindow(SW_SHOWNORMAL);


m_wndProgress.MoveWindow(rect.left, rect.top, rect.right, rect.bottom);//* 注意:此处同样可以使用SetWindowPos()来调整位置及大小
posted @ 2011-10-04 18:33 Jacc.Kim 阅读(5928) | 评论 (0)编辑 收藏

声明按钮对象
CButton m_wndBtn;
创建按钮对象
CRect rect;
//* 按钮
 rectClient.left = 0;
 rectClient.top = 35;
 rectClient.right = 200;
 rectClient.bottom = 35;
 if (!m_wndButton.Create(_T("Button"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, rectClient, this, 7))
 {
  TRACE0("Failed to create button.");
  return -1;
 }
 m_wndButton.ShowWindow(SW_SHOWNORMAL);
wndBtn.MoveWindow(rect.left, rect.top, rect.right, rect.bottom);//* 注意:CButton对SetWindowPos()免疫,此暂时也不知道是啥情况。请高手不吝赐教。
posted @ 2011-10-04 18:27 Jacc.Kim 阅读(978) | 评论 (0)编辑 收藏

原文转自:http://blog.csdn.net/hhaoma/article/details/3165783

函数功能:该函数改变一个子窗口,弹出式窗口式顶层窗口的尺寸,位置和Z序。子窗口,弹出式窗口,及顶层窗口根据它们在屏幕上出现的顺序排序、顶层窗口设置的级别最高,并且被设置为Z序的第一个窗口。
  函数原型:BOOL SetWindowPos(HWN hWnd,HWND hWndlnsertAfter,int X,int Y,int cx,int cy,UNIT.Flags);
  参数:
  hWnd:窗口句柄。
  hWndlnsertAfter:在z序中的位于被置位的窗口前的窗口句柄。该参数必须为一个窗口句柄,或下列值之一:
  HWND_BOTTOM:将窗口置于Z序的底部。如果参数hWnd标识了一个顶层窗口,则窗口失去顶级位置,并且被置在其他窗口的底部。
  HWND_DOTTOPMOST:将窗口置于所有非顶层窗口之上(即在所有顶层窗口之后)。如果窗口已经是非顶层窗口则该标志不起作用。
  HWND_TOP:将窗口置于Z序的顶部。
  HWND_TOPMOST:将窗口置于所有非顶层窗口之上。即使窗口未被激活窗口也将保持顶级位置。
  查看该参数的使用方法,请看说明部分。
  x:以客户坐标指定窗口新位置的左边界。
  Y:以客户坐标指定窗口新位置的顶边界。
  cx:以像素指定窗口的新的宽度。
  cy:以像素指定窗口的新的高度。
  uFlags:窗口尺寸和定位的标志。该参数可以是下列值的组合:
  SWP_ASNCWINDOWPOS:如果调用进程不拥有窗口,系统会向拥有窗口的线程发出需求。这就防止调用线程在其他线程处理需求的时候发生死锁。
  SWP_DEFERERASE:防止产生WM_SYNCPAINT消息。
  SWP_DRAWFRAME:在窗口周围画一个边框(定义在窗口类描述中)。
  SWP_FRAMECHANGED:给窗口发送WM_NCCALCSIZE消息,即使窗口尺寸没有改变也会发送该消息。如果未指定这个标志,只有在改变了窗口尺寸时才发送WM_NCCALCSIZE。
  SWP_HIDEWINDOW;隐藏窗口。
  SWP_NOACTIVATE:不激活窗口。如果未设置标志,则窗口被激活,并被设置到其他最高级窗口或非最高级组的顶部(根据参数hWndlnsertAfter设置)。
  SWP_NOCOPYBITS:清除客户区的所有内容。如果未设置该标志,客户区的有效内容被保存并且在窗口尺寸更新和重定位后拷贝回客户区。
  SWP_NOMOVE:维持当前位置(忽略X和Y参数)。
  SWP_NOOWNERZORDER:不改变z序中的所有者窗口的位置。
  SWP_NOREDRAW:不重画改变的内容。如果设置了这个标志,则不发生任何重画动作。适用于客户区和非客户区(包括标题栏和滚动条)和任何由于窗回移动而露出的父窗口的所有部分。如果设置了这个标志,应用程序必须明确地使窗口无效并区重画窗口的任何部分和父窗口需要重画的部分。
  SWP_NOREPOSITION;与SWP_NOOWNERZORDER标志相同。
  SWP_NOSENDCHANGING:防止窗口接收WM_WINDOWPOSCHANGING消息。
  SWP_NOSIZE:维持当前尺寸(忽略cx和Cy参数)。
  SWP_NOZORDER:维持当前Z序(忽略hWndlnsertAfter参数)。
  SWP_SHOWWINDOW:显示窗口。
  返回值:如果函数成功,返回值为非零;如果函数失败,返回值为零。若想获得更多错误消息,请调用GetLastError函数。
  备注:如果设置了SWP_SHOWWINDOW和SWP_HIDEWINDOW标志,则窗口不能被移动和改变大小。如果使用SetWindowLoog改变了窗口的某些数据,则必须调用函数SetWindowPos来作真正的改变。使用下列的组合标志:SWP_NOMOVEISWP_NOSIZEISWP_FRAMECHANGED。
  有两种方法将窗口设为最顶层窗口:一种是将参数hWndlnsertAfter设置为HWND_TOPMOST并确保没有设置SWP_NOZORDER标志;另一种是设置窗口在Z序中的位置以使其在其他存在的窗口之上。当一个窗口被置为最顶层窗口时,属于它的所有窗口均为最顶层窗口,而它的所有者的z序并不改变。
  如果HWND_TOPMOST和HWND_NOTOPMOST标志均未指定,即应用程序要求窗口在激活的同时改变其在Z序中的位置时,在参数hWndinsertAfter中指定的值只有在下列条件中才使用:
  在hWndlnsertAfter参数中没有设定HWND_NOTOPMOST和HWND_TOPMOST标志。
  由hWnd参数标识的窗口不是激活窗口。
  如果未将一个非激活窗口设定到z序的顶端,应用程序不能激活该窗口。应用程序可以无任何限制地改变被激活窗口在Z序中的位置,或激活一个窗口并将其移到最高级窗口的顶部或非最高级窗口的顶部。
  如果一个顶层窗口被重定位到z序的底部(HWND_BOTTOM)或在任何非最高序的窗口之后,该窗口就不再是最顶层窗口。当一个最顶层窗口被置为非最顶级,则它的所有者窗口和所属者窗口均为非最顶层窗口。
  一个非最顶端窗口可以拥有一个最顶端窗口,但反之则不可以。任何属于顶层窗口的窗口(例如一个对话框)本身就被置为顶层窗口,以确保所有被属窗口都在它们的所有者之上。
  如果应用程序不在前台,但应该位于前台,就应调用SetForegroundWindow函数来设置。
  Windows CE:如果这是一个可见的顶层窗口,并且未指定SWP_NOACTIVATE标志,则这个函数将激活窗口、如果这是当前的激活窗口,并且指定了SWP_NOACTIVATE或SWP_HIDEWINDOW标志,则激活另外一个可见的顶层窗口。
  当在这个函数中的nFlags参数里指定了SWP_FRAMECHANGED标志时,WindowsCE重画窗口的整个非客户区,这可能会改变客户区的大小。这也是重新计算客户区的唯一途径,也是通过调用SetwindowLong函数改变窗口风格后通常使用的方法。
  SetWindowPos将使WM_WINDOWPOSCHANGED消息向窗口发送,在这个消息中传递的标志与传递给函数的相同。这个函数不传递其他消息。
  Windows CE 1.0不支持在hWndlnsertAber参数中的HWND_TOPMOST和HWND_NOTOPMOST常量。
  Windows CE1.0不支持在fuFags参数中的SWP_DRAWFRAME和SWP_NOCOPYBITS标志。
  速查:Windows NT:3.1以上版本;Windows:95以上版本;Windows CE:1.0以上版本;头文件:winuser.h库文件:eser32lib。
posted @ 2011-10-01 19:33 Jacc.Kim 阅读(3039) | 评论 (0)编辑 收藏

MFC 之树控件篇

CTreeCtrl m_wndMyTree;

1) 取得树的当前选中节点:
HTREEITEM hSelectedItem = m_wndMyTree.GetSelectedItem();

2) 取得指定节点的标签值(也就是Caption):
CString strCaption = m_wndMyTree.GetItemText(hSelectedItem);

3) 记住:MFC中的树的节点,是没有索引这一概念的。一棵树的唯一辨别方法是通过树节点
的句柄(HTREEITEM)区别的。(这一点不同于Delphi中的树).Delphi中的树是的每个节点都
有以下两个属性:a) 节点的层次 b) 节点的在当前层次中其父节点下的第几个索引号。

4) 可以通过如下方法,对树节点进行额外数据的存储。
CMyClass *pObj = new CMyClass;
m_wndMyTree.SetItemData(hSelectedItem, (DWORD_PTR)pObj);
上面这两句,等同于Delphi的:
hSelectedItem.Data := Pointer(pObj);//或 hSelectedItem := pObj;
另外,需要注意的一点:为树节点设置了Data值后,在删除节点时,需要释放掉它。(这在
Delphi中是必须要做的一件事。在MFC中,本人相信也是必须要做的。因本人也初学MFC,故
未经验证。待有机会,再行验证)

有了上面的SetItemData()。固然也会有GetItemData()

CMyClass *pMyObj = (CMyClass *)m_wndMyTree.GetItemData(hSelectedItem);
...


5) 取得树的根节点:
HTREEITEM hRoot = m_wndMyTree.GetRootItem();

6) 取得指定节点的下一个兄弟节点
HTREEITEM hCurrItem = xxx;
HTREEITEM hNextItem = m_wndMyTree.GetNextItem(hCurrItem, TVGN_NEXT);

7) 取得指定节点的第一个子节点:
HTREEITEM hFirstChildItem = m_wndMyTree.GetNextItem(hCurrItem, TVGN_CHILD);

有了上面的5、6、7,我们就可以对树进行遍历。参考示例如下:

void CViewTree::RecursiveTree(HTREEITEM hItem/* = NULL*/)
{
 if (NULL == hItem)
  return ;
 AfxMessageBox(GetItemText(hItem));
 HTREEITEM hFirstChild = GetNextItem(hItem, TVGN_CHILD);

 if (NULL != hFirstChild)
  RecursiveTree(hFirstChild);

 HTREEITEM hNextItem = GetNextItem(hItem, TVGN_NEXT);
 if (NULL != hNextItem)
  RecursiveTree(hNextItem);
}

调用方法如下:

 HTREEITEM hRoot = GetRootItem();
 if (NULL == hRoot)
 {
  AfxMessageBox(_T("对不起,当前这棵树没有任何节点。"));
 }
 else
 {
  this->RecursiveTree(hRoot);
 }

8) 判断指定节点下是否有子节点
方法一:
HTREEITEM hCurrItem = xxx;
HTREEITEM hFirstChild = GetNextItem(hCurrItem, TVGN_CHILD);
if (NULL != hFirstChild)
      //有子节点
else
      //没有子节点
方法二:
if (ItemHasChildren(hCurrItem))
      //有子节点
else
      //没有子节点
9) 清除所有节点:
m_wndMyTree.DeleteAllItems();

以上为常用的一些方法总结。详细的,可查看CTreeCtrl类接口声明。。或详查MSDN

posted @ 2011-10-01 19:19 Jacc.Kim 阅读(3938) | 评论 (2)编辑 收藏

仅列出标题
共14页: First 6 7 8 9 10 11 12 13 14