vc小技巧

1、登陆菜单============================================================
   m_hMenu = ::LoadMenu(hInstResource, MAKEINTRESOURCE(nMenu));//得到HMENU
   CMenu mnu;    mnu.Attach( m_hMenu );
   CMenu mnu;    mnu.LoadMenu(nMenu);
   CMenu* pMenu = CMenu::FromHandle(m_hMenu );

   CMenu *menu,*popup;
   menu=new CMenu();
   menu->LoadMenu(IDR_MENU1);
   popup=menu->GetSubMenu(0);
   ===========================================================================
 得到应用程序路径
  CString   m_strPath;   
  GetModuleFileName(NULL,m_strPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);   
  m_strPath.ReleaseBuffer();

2、响应键盘鼠标输入等==================================================
void CYourDlg::PreTranslateMessage(MSG* pMsg) 
{
    if (WM_KEYFIRST <= pMsg->message && pMsg->message <= WM_KEYLAST) 
    {
        if(pMsg->message==WM_KEYDOWN)
        {
            int iID = ::GetDlgCtrlID(hWnd);
            if(iID == IDC_EDIT_INPUT)
            {
                if(pMsg->wParam==13)//回车
                {
                }  
            }
        }
    }
}

3、编辑框拉到最下面===================================================
CEdit *pEdit = (CEdit *)GetDlgItem(IDC_EDIT_SEND);
pEdit->SendMessage(WM_VSCROLL, SB_BOTTOM);

PostMessage(WM_VSCROLL, SB_BOTTOM); 

==========================================================================================
4、我要实现OnButton()用记事本打开文本文件,该用什么类函数.如何实现============================
ShellExecute(this->m_hWnd,"open","notepad.exe","c://MyLog.txt","",SW_SHOW );

==========================================================================================
5、应用程序退出函数
PostQuitMessage(0);

==========================================================================================
6、设置当前窗口函数(主窗口函数里面)
SetForegroundWindow();

===========================================================================================
7、得到活动视图
CMainFrame *pMainFrame = (CMainFrame *)AfxGetMainWnd();
CMy7View* pView=(CMy7View*)pMainFrame->GetActiveView();

===========================================================================================
8、得到应用程序指针和打开文件
CLinkmestApp* pApp=(CLinkmestApp*) AfxGetApp();    
pApp->OpenDocumentFile(infilename);
===========================================================================================
9、静态成员函数没有this,也就没有m_hWnd,因此出错。
使用AfxMessageBox

===========================================================================================
10、在DLL模块中调用GetModuleHandle(NULL)返回哪个模块的句柄,exe还是dll?
exe!If this parameter is NULL, GetModuleHandle returns a handle to the file used to create the calling process.

===========================================================================================
11、如何将CString类型转化为float类型啊,急死了,帮忙啊. 
CString a="32.2";
float b = atof(a);

===========================================================================================
12、窗口句柄
HWND FindWindow(
  LPCTSTR lpClassName,  // pointer to class name
  LPCTSTR lpWindowName  // pointer to window name
);
===========================================================================================
13、模式和无模式对话的中止是不一样的:
模式对话通过调用CDialog : : EndDialog 来中止,无模式对话则是调用
CWnd: : DestroyWindow来中止的,

===========================================================================================
14、动态创建的edit没有边框的问题
 m_edit.Create(....);
 m_edit.ModifyStyleEx(0, WS_EX_CLIENTEDGE, SWP_DRAWFRAME);

===========================================================================================
15、改变richedit指定区域的颜色及字体

        CHARFORMAT cf;
        ZeroMemory(&cf, sizeof(CHARFORMAT));
        cf.cbSize = sizeof(CHARFORMAT);
        cf.dwMask = CFM_BOLD | CFM_COLOR | CFM_FACE |
                            CFM_ITALIC | CFM_SIZE | CFM_UNDERLINE;
        cf.dwEffects = 0;
        cf.yHeight = 12*12;//文字高度
        cf.crTextColor = RGB(200, 100, 255); //文字颜色
        strcpy(cf.szFaceName ,_T("隶书"));//设置字体
     
        m_richedit1.SetSel(1, 5); //设置处理区域
        m_richedit1.SetSelectionCharFormat(cf);

===========================================================================================
16、随输入自动滚动到最后一行(richedit同样适用)

    方法一:(摘自msdn)
        // The pointer to my edit.
        extern CEdit* pmyEdit;
        int nFirstVisible = pmyEdit->GetFirstVisibleLine();

        // Scroll the edit control so that the first visible line
        // is the first line of text.
        if (nFirstVisible > 0)
        {
            pmyEdit->LineScroll(-nFirstVisible, 0);
        }
    方法二:
        m_richedit.PostMessage(WM_VSCROLL, SB_BOTTOM, 0);
===========================================================================================
17、在edit最后添加字符串

        CString str;
        m_edit1.SetSel(-1, -1);
        m_edit1.ReplaceSel(str);
===========================================================================================
18、判断edit中光标状态并得到选中内容(richedit同样适用)

        int nStart, nEnd;
        CString strTemp;

        m_edit1.GetSel(nStart, nEnd);
        if(nStart == nEnd)
        {
            strTemp.Format(_T("光标在%d"), nStart);
            AfxMessageBox(strTemp);
        }
        else
        {
            //得到edit选中的内容     
            m_edit1.GetWindowText(strTemp);
            strTemp = strTemp.Mid(nStart) - strTemp.Mid(nEnd);
            AfxMessageBox(strTemp); 
        }
    注:GetSel后,如果nStart和nEnd,表明光标处于某个位置(直观来看就是光标在闪动);
             如果nStart和nEnd不相等,表明用户在edit中选中了一段内容。
===========================================================================================
19、设置edit只读属性

    方法一:
                m_edit1.SetReadOnly(TRUE);
    方法二:
                ::SendMessage(m_edit1.m_hWnd, EM_SETREADONLY, TRUE, 0);
    方法三:    在属性中直接选中!
===========================================================================================
20、如何限制edit输入指定字符

   可以从CEdit派生一个类,添加WM_CHAR消息映射。下面一个例子实现了限定输入16进制字符的功能。

   void CMyHexEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)  
   { 
        if ( (nChar >= '0' && nChar <= '9') || 
             (nChar >= 'a' && nChar <= 'f') || 
             (nChar >= 'A' && nChar <= 'F') || 
              nChar == VK_BACK ||  
              nChar == VK_DELETE)    //msdn的virtual key
       { 
            CEdit::OnChar(nChar, nRepCnt, nFlags); 
        }     
   }
==========================================================================================
21、对话框的背景贴上一张图
1.在对话框头文件件定义CBrush m_brBk;
2.HBRUSH CxxDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
if (pWnd == this)
{
return m_brBk;
}
}
3.BOOL CxxDlg::OnInitDialog()
{
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);
m_brBk.CreatePatternBrush(&bmp);
bmp.DeleteObject();
}
=========================================================================================
22、在TreeList中使用Edit功能 
首先TreeList应该使用TVS_EDITLABELS风格,可以在创建资源时指定,或者在使用Create时指定,或者在PreCreateWindos()中改变。 

接下来需要处理TVN_BEGINLABELEDIT和TVN_ENDLABELEDIT消息。  

void CXXXX::OnBeginLabelEdit(NMHDR* pNMHDR, LRESULT* pResult) 
{

        TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;

        // Limit text length

        GetEditControl()->LimitText(127);

        *pResult = 0;
}
如果不处理 TVN_ENDLABELEDIT 消息,则文本的更改不会生效。
 void COutline::OnEndLabelEdit(NMHDR* pNMHDR, LRESULT* pResult) 
{
        GetEditControl()->GetWindowText(s);
        // Set result to TRUE to accept the changes
        *pResult = TRUE;
}
=========================================================================================
23、如何动态改变Picture控件里的图片
   HBITMAP hBitmap = (HBITMAP)::LoadImage(NULL, "这里是你的*.bmp图片位置(如:             D://VC//1.bmp)", IMAGE_BITMAP, 0,0,LR_LOADFROMFILE | LR_CREATEDIBSECTION |                    LR_DEFAULTSIZE);((CStatic *)GetDlgItem(Picture控件ID))->SetBitmap(hBitmap);
=========================================================================================
24、关于在CButton上贴位图的问题 
方法一:
首先,你得选中按钮的owner Draw属性,在资源中加载两副*.bmp格式的位图,然后在你的对话框类中加入:
CBitmapButton m_btnX1;//必须放在函数外面才能正常实现

BOOL CXXXXXXX::OnInitDialog()
{
CDialog::OnInitDialog();

m_btnX1.LoadBitmaps(IDB_XXXX_UP,IDB_XXXX_DOWN);//这里是两副位图,鼠标按下和弹起,
                                               //  也可以只加一个ID资源;
m_btnX1.SubclassDlgItem(IDC_DASEN_X1,this);
m_btnX1.SizeToContent();
}

方法二:

首先要在资源编辑器的按钮属性对话框中设置按钮的bitmap属性为TRUE
CBitmap Bitmap;
Bitmap.LoadBitmap(IDB_BITMAP1);
HBITMAP hBitmap = (HBITMAP)Bitmap.Detach();
CButton *pButton=(CButton*)GetDlgItem(IDC_BUTTON2);
pButton->SetBitmap(hBitmap);

关于在CButton上贴icon图标的问题 

首先要在资源编辑器的按钮属性对话框中设置按钮的Icon属性为TRUE
HICON hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
CButton *pButton=(CButton*)GetDlgItem(IDC_BUTTON1);
pButton->SetIcon(hIcon);

=========================================================================================
25、如何动态获取工具条指针并给工具条加标题?

  [问题提出]
  工具条也是窗口,是窗口就有标题,如何给工具条加标题?
  [程序实现]
  不想动态改变工具条的标题就在CMainFrame::OnCreate()中:
  int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  {
   ......
   m_wndToolBar.SetWindowText(_T("Standdard")); 

   return 0;
  }
  若想动态改变工具条的标题,如下:
  声明一个菜单,并响应事件,如响应:OnMyToolBar()函数
  void CMainFrame::OnMyToolBar() 
  {
   // TODO: Add your command handler code here
   CToolBar * pToolBar =(CToolBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOOLBAR); 
   pToolBar->SetWindowText (_T("Standdard"));
  }
  不要在TooBar悬浮时做OnMyToolBar()会出错的. 
  顺便提一下如何获得状态条的指针:
  CStatusBar * pStatusBar =(CStatusBar *)AfxGetMainWnd()->GetDescendantWindow   (AFX_IDW_STATUS_BAR); 
========================================================================================
26、为什么即使调用EnableMenuItem菜单项后,菜单项还处于禁止状态?

  [问题提出]
    在单文档工程中,编辑->撤销菜单选项是灰色不可用状态,如何使他不灰化?使用EnableMenuItem   (ID_EDIT_UNDO,MF_BYCOMMAND | MF_ENABLED);不好使.

  [解决方法]
    在MainFrame中有个m_bAutoMenuEnable成员变量,默认是TRUE,要把它FALSE了,就好使了.

  [程序实现]
    在你的工程建立一个菜单,建立响应的函数如:OnYourOperate().
    void CMainFrame::OnYourOperate() 
    {
       // TODO: Add your command handler code here
       CMenu* pMenu=GetMenu (); 
       m_bAutoMenuEnable=FALSE;
       ASSERT_VALID (pMenu); 
       pMenu->EnableMenuItem (ID_EDIT_UNDO,MF_BYCOMMAND | MF_ENABLED); 

    }
    编译运行,不要做其他操作,先试试点你的菜单后编辑->撤销是否不灰化了.
    试试去掉m_bAutoMenuEnable=FALSE;操作一下. 
========================================================================================
27、如何在编辑控件中以追加的方式添入字符?

  [问题提出]
    SetDlgItemText可以向Edit控件中输入字符,发送更新的消息也可是Edit控件显示与其关联的变量的值,   但若是向已有的Edit字符后追加字符,该如何做?
  [程序实现]
    建立名为My的对话框工程,添加一个Edit和一个Button控件.Edit的ID=IDC_EDIT1,Button的        ID=IDC_BUTTON1.建立和IDC_BUTTON1的响应函数:OnButton1()
    void CMyDlg::OnButton1() 
    {
       CString pText="你好";
       CEdit *m_Edit=(CEdit *)GetDlgItem(IDC_EDIT1);
       int nLen=m_Edit->GetWindowTextLength(); 
       m_Edit->SetFocus(); 
       m_Edit->SetSel(nLen, nLen); 
       m_Edit->ReplaceSel(pText); 
    }
  在Edit控件中输入字符,想追加时按IDC_BUTTON1按钮.
========================================================================================
28、为基于MFC的对话框添加ToolTip的简单方法

  此方法适用于MFC派生类,在基于对话框的类中测试通过。具体步骤如下:

  1、选择“Project”菜单,然后“Set Active Project” 。
  2、选择“Project”菜单 -->“Add to Project” -->“Components and Controls” -->“VC++      Components” --> “ToolTip Support” 
  3、选择“Insert” 
  4、在对话框资源中加入一个按钮,ID为IDC_ToolTip
  5、在 CDialog::OnInitDialog() 中找到下面的注释行:

     // TODO: Use one of the following forms to add controls:
     // m_tooltip.AddTool(GetDlgItem(IDC_), );
     // m_tooltip.AddTool(GetDlgItem(IDC_), "");
     然后在注释行后加入一行代码:
     m_tooltip.AddTool(GetDlgItem(IDC_ToolTip), "显示 ToolTip");
     经过上面的步骤之后:
     头文件(*.h)中会自动加入下面的代码:
        public:
        virtual BOOL PreTranslateMessage(MSG* pMsg);
     实现文件(*.cpp)会加入方法实现:
        PreTranslateMessage(MSG* pMsg);
     编译程序执行吧,将鼠标指针移到ToolTip按钮上就会显示出一个ToolTip信息。
========================================================================================
29、在程序进行中不响应ESC,Enter键应该怎么做?

  [问题提出]
    对话框程序ESC和ENTER健会导致程序退出,在程序进行中不响应ESC,Enter键应该怎么做?

  [问题解答]

  方法1:重载CDialog::OnOK();
  方法2:
    BOOL CCXXX::PreTranslateMessage(MSG* pMsg) 
    {
        if(pMsg->message == WM_KEYDOWN)
        {
            switch(pMsg->wParam)
            {
                case VK_RETURN://屏蔽回车
                return TRUE;
                case VK_ESCAPE://屏蔽Esc
                return TRUE;
            }
        } 
        return CDialog::PreTranslateMessage(pMsg);
     } 
========================================================================================
30、让应用程序有启动画面
   在应用程序中,从Project 菜单中选择AddToProject,并单击位于次级菜单上的Components    andControls...,选择Splashscreen组件,如图1所示,单击Insert。 接受所有的默认设置。
========================================================================================
31、如何处理自定义消息

    ClassWizard不允许增加用户自定义消息,所以你必须手工输入。输入后,ClassWizard就可以象处理其 它消息一样处理你自定义的消息了。

    下面是增加自定义消息的步骤:

    第一步:定义消息。开发Windows应用程序时,Microsoft推荐用户自定义消息至少是WM_USER+100,因  为很多新控件也要使用WM_USER消息。#define  MYWM_MESSAGE  WM_USER+100  #define WM_MY_MESSAGE (WM_USER+100),

    第二步:实现消息处理函数。该函数使用WPRAM和LPARAM参数并返回LPESULT。 

 LPESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam)
 {
           // TODO: 处理用户自定义消息
          ...
            return 0;
 }
    第三步:在类头文件的AFX_MSG块中说明消息处理函数:

 class CMainFrame:public CMDIFrameWnd
 {
    ...
    // 一般消息映射函数
    protected:
        // {{AFX_MSG(CMainFrame)
        afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
        afx_msg void OnTimer(UINT nIDEvent);
        afx_msg LRESULT OnMyMessage(WPARAM wParam,  LPARAM lParam);
        //}}AFX_MSG
        DECLARE_MESSAGE_MAP()
 }
    第四步:在用户类的消息块中,使用ON_MESSAGE宏指令将消息映射到消息处理函数中。

 BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
    //{{AFX_MSG_MAP(CMainFrame)
    ON_WM_CREATE()
    ON_WM_TIMER()
    ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)
    //}}AFX_MSG_MAP
 END_MESSAGE_MAP()
    如果用户需要一个整个系统唯一的消息,可以调用SDK函数RegisterWindowMessage并使用 ON_REGISTER_MESSAGE宏指令取代ON_MESSAGE宏指令,其余步骤同上。
========================================================================================
32、在对话框中的控件中显示自的光标定义
BOOL CButtonDlg::PreTranslateMessage(MSG* pMsg) 
{
 // TODO: Add your specialized code here and/or call the base class
         HWND hWnd = ::GetFocus();
 int iID = ::GetDlgCtrlID(hWnd);
         (GetDlgItem(IDC_EDIT1))->m_hWnd;
 if(iID == IDC_EDIT1)
 {
                  ::HideCaret(hWnd);
          ::SetCursor(::LoadCursor(NULL,IDC_HELP));  
 
 }
 return CDialog::PreTranslateMessage(pMsg);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值