zoukankan      html  css  js  c++  java
  • VC技巧03

    151 改变CStatic控件的前景、背景色:http://community.csdn.net/Expert/topic/4507/4507710.xml?temp=.1524164
    处理WM_CTLCOLOR消息:
    ---------------------------------------------------------------------
    HBRUSH CQQDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
    HBRUSH hbr;

    // TODO: Change any attributes of the DC here
    if(CTLCOLOR_STATIC == nCtlColor)
    //if(CTLCOLOR_STATIC == nCtlColor && pWnd->GetDlgCtrlID()==IDC_TOOL) //改成这样就只对IDC_TOOL这一个静态文本控件起作用了
    {
       pDC->SetBkColor(RGB(255,255,255));         //背景色为白
       pDC->SetTextColor(RGB(0,0,0));             //前景色为黑
       hbr = CreateSolidBrush(RGB(255,255,255)); //其它区域也为白
       //上面三行代码改成下面这三行就创建空心刷子,就可以实现在背景上写字的效果了
       //pDC->SetBkMode(TRANSPARENT);
       //pDC->SetTextColor(RGB(0,0,0));
       //hbr = CreateStockObject(NULL_BRUSH);    
    }
    else
       hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    // TODO: Return a different brush if the default is not desired
    return hbr;
    }
    ----------------------------------------------------------------------
    再加一个判断if (pWnd->GetDlgCtrlID()==IDC_....)就可以指定是改变哪个的颜色了,其它控件的颜色的改变方法和这个大同小异。
    152 怎样获得字体得宽度,高度,间距等信息:GetTextMetrics
    153 为了让你对i++有个更清楚的认识,先看如下代码:
    -------------------
    int i=2;
    i=(i++) % 3;
    printf("i=%d",i);              //这里输出i=?呢
    -------------------
    下面是前两行代码的汇编代码:
    ------------------------------------------------------------------------------------------------------------------
    00401778   mov         dword ptr [ebp-4],2        把值2写入内存中[ebp-4]指向的位置(后面称变量i) //相当于i=2
    0040177F   mov         eax,dword ptr [ebp-4]      把i的当前值2赋于eax中                          //把eax当成了i的临时变量了
    00401782   cdq
    00401783   mov         ecx,3                      把3赋于ecx中                                   //同样ecx也成了临时变量了
    00401788   idiv        eax,ecx                    eax % ecx(2%3),结果放入edx中(等于2)
    0040178A   mov         dword ptr [ebp-4],edx      把edx中的值2写入变量i                          //相当于计算i=2 % 3     
    0040178D   mov         edx,dword ptr [ebp-4]      把i的值2赋于edx                                //现在edx成了i的临时变量
    00401790   add         edx,1                      edx中的值加上1
    00401793   mov         dword ptr [ebp-4],edx      把edx中的值3写入变量i                          //上面三条命令完成i=i+1
    ------------------------------------------------------------------------------------------------------------------
    最终的结果i=3,如果把运算符%换成+,则结果i=6(注意,这是在VC下得到的结果,不同的编译器得到的结果可能会不同!)
    154 我的程序知道一个应用程序的句柄,如何使该应用程序得到焦点:http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=192872
    ---------------------------------------------------------------
    if(::GetForegroundWindow()!=m_MainWnd)
    ::SetForegroundWindow(m_MainWnd);
    ::SetFocus( m_MainWnd);
    ---------------------------------------------------------------
    或:
    ------------------------------------
    ::ShowWindow(m_MainWnd, SW_SHOW);
    ::SetForegroundWindow(m_MainWnd);
    ------------------------------------
    155 在对话框的标题栏上添加按钮:http://www.codeguru.com/Cpp/W-D/dislog/titlebar/article.php/c1897
    156 判断当前线程的当前输入法是中文还是英文输入法(至于到底是哪种中文输入法我也不知道):
    -------------------------------------------------------------------------
    HKL hKl = GetKeyboardLayout(0); //这里0表示当前线程,要查指定线程的话可以用指定线程的标识符代替
    if (ImmIsIME(hKl))
    AfxMessageBox("当前是中文输入法。");
    -------------------------------------------------------------------------
    其它地区语言输入法的信息在MSDN中搜索:Table of Language Identifiers
    157 动态创建静态控件并加载.bmp图片,先在对话框类中定义成员变量:
    ----------------------------------------------------
    public:
    CStatic m_pp;    //这个是在对话框类中定义的
    再:
    CBitmap cb;
    cb.LoadBitmap(IDB_BITMAP1);
    m_pp.Create("",WS_CHILD|WS_VISIBLE|SS_BITMAP,CRect(10,10,200,200),this,101);
    m_pp.SetBitmap((HBITMAP)cb);
    ----------------------------------------------------
    158 DLL中创建窗口时对于资源等,需要先进行状态处理:AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
    159 把图片中某种指定色变成透明色,在对话框的OnPaint()中加入类似如下代码:
    -------------------------------------------------------------------------------
    //CImage imgOriginal;
    int XWitdh=imgOriginal.GetWidth();
    int XHeight=imgOriginal.GetHeight();
    COLORREF TransparentColor= RGB(0x00,0x00,0x00);     //这里黑色变成透明色
    CPaintDC dc(this);
    imgOriginal.TransparentBlt(dc.m_hDC,0,0,XWitdh,XHeight,TransparentColor);
    imgOriginal.StretchBlt(dc,0,0,imgOriginal.GetWidth()/2,imgOriginal.GetHeight()/2,SRCCOPY);
    -------------------------------------------------------------------------------
    160 怎么修改MFC单文档程序的标题,经常有人在网上问这个问题,在C****App::InitInstance()的代码中加入一行就行了:
    -----------------------------------------------------------
    BOOL CJPGGifApp::InitInstance()
    {
    AfxEnableControlContainer();
    ......      //这里省略自动生成的代码
    // The one and only window has been initialized, so show and update it.
    m_pMainWnd->ShowWindow(SW_SHOW);
    m_pMainWnd->UpdateWindow();
    m_pMainWnd->SetWindowText("我的标题");    //加入这一行就可以了,注意要加在ShowWindow和UpdateWindow的后面

    return TRUE;
    }
    ------------------------------------------------------------
    161 怎么使用双缓冲防闪烁:http://community.csdn.net/Expert/topic/4236/4236258.xml?temp=5.736941E-02                          <==========还没试,不知道有没有效果
    162 鼠标左右键同时按下与鼠标与键盘同时按下的识别:http://www.vckbase.com/article/misc/0017.htm

      玩过Windows的扫雷游戏吗?该游戏中就有一个同时按下鼠标左右键的操作,其实对同时按下鼠标左右键的判断并不复杂,判断方法与判断鼠标按键是否与Ctrl和Shift同时按下的方法相同,这里要用到鼠标消息中的wparam项,其中含有我们想要的几个按键的状态。定义如下:

      (1)MK_CONTROL:Ctrl键按下时置1;

      (2)MK_LBUTTON:鼠标左键按下时置1;

      (3)MK_MBUTTON:鼠标中键按下时置1;

      (4)MK_RBUTTON:鼠标右键按下时置1;

      (5)MK_SHIFT:Shift键按下时置1。

      通过判断这几个标志位可以得到同时按下的几个键的状态,从而判断是否有其它键同时按下。


    163 数据库方面:http://community.csdn.net/Expert/topic/4500/4500287.xml?temp=.2734644             <===================还没试
    164 取得Excel中文本框的内容:http://community.csdn.net/Expert/topic/4356/4356294.xml?temp=.41
    165 Microsoft Office Development with Visual Studio:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnoxpta/html/vsofficedev.asp
    166 让编译器忽略某种警告:
    --------------------------------
    #pragma warning (disable : 4101)
    --------------------------------
    上面的代码加上后编译器不会再出现warning C4101: 'i' : unreferenced local variable这样的警告了。
    167 枚举网页各个元素,参考:
    http://www.vckbase.com/document/viewdoc/?id=288
    http://www.vckbase.com/document/viewdoc/?id=1446
    168 rundll32.exe,这个程序很方便,用它可以调用任何 DLL 中的函数。你只要给它提供 DLL、函数名以及要传递的参数即可。Rundll32.exe 绝对多才多艺,你可以用它来关闭和重启 Windows,创建快捷方式以及启动控制面板程序。只要知道要调用的DLLs,一切都搞掂。你可以象下面这样用 rundll32.exe 从命令行打开一个 URL:
    --------------------------------------------------------
    rundll32.exe url.dll,FileProtocolHandler www.vckbase.com
    --------------------------------------------------------
    url.dll 中的函数 FileProtocolHandler 负责这个工作。
    169 HDC===>CDC*
    ----------------------------------
    HDC hdc=::GetWindowDC(this->m_hWnd);     //获得窗口标题栏区域
    CDC* pDC = CDC::FromHandle(hdc);
    ----------------------------------
         CDC*===>HDC,可以通过CDC的操作符HDC()来实现:
    ------------------
    HDC hdc=HDC(pDC);      //或:HDC hdc=pDC->m_hdc;
    ------------------
    170 操作状态栏,下面以在状态栏中显示鼠标当前坐标为例,代码如下:
    -------------------------------------------------------------------------------------------
    CMyView::OnMouseMove(UINT nFlag,CPoint point)
    {
    CClientDC dc(this);
    CMainFrame *pFrame = (CMainFrame *)AfxGetApp()->m_pMainWnd;
    CStatusBar *pStatusBar = (CStatusBar *)&pFrame->m_wndStatusBar;
    CString str;
    str.Format("x:%d,y:%d",point.x,point.y);
    CSize size = dc.GetTextExtent(str);        //得到文本所需的大小尺寸
    int nIndex = pStatusBar->CommandToIndex(ID_INDICATOR_MOUSEPOS);
    pStatusBar->SetPaneInfo(nIndex,ID_INDICATOR_MOUSEPOS,SBPS_NORMAL,size.cx);   //按文本所需的宽度设置状态栏宽度
    pStatusBar->SetPaneText(nIndex,str);

    CView::OnMouseMove(nFlags, point);
    }
    -------------------------------------------------------------------------------------------
    171 一些工具的简单介绍:http://www.yesky.com/SoftChannel/72347895172431872/20050306/1918484.shtml
    172 一个有争论的问题,关于delete p和delete []p的区别所在:http://community.csdn.net/Expert/topic/4402/4402653.xml
           http://community.csdn.net/Expert/topic/4411/4411478.xml?temp=.5596582
    173 GetDeviceCaps,一个可得到很多关于指定设备的具体信息的函数
    174 注册表中:HKEY_CURRENT_USER\KeyboardLayout\preload分支下分别有输入法对应的1、2、3、4几个主键,其键值一一对应已安装的输入法,如:1的键值00000409是英文输入法,知道具体输入法和键值的对应关系后,我们可以根据得到的键值判断用户的当前输入法了。
    175 在托盘区处显示气泡提示:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/ifaces/iusernotification/SetBalloonInfo.asp
    176 设置对话框的背景色的简单方法,其实只要在CWinapp的InitInstance的里面添加一行代码就行了:
    ---------------------------------------------------------
    BOOL CBOOKApp::InitInstance()
    {
    AfxEnableControlContainer();
    SetDialogBkColor(RGB(213,240,227),RGB(173,7,95));    //添加这行,前者为背景色,后者为前景色
    .....    
    }
    ---------------------------------------------------------
    177 显示gif动画表情的CRechEdit控件:http://lzzqqq.blogchina.com/2819759.html
    178 单文档程序,如何使程序窗口一开始就固定在某一尺寸:PreCreateWindow中指定大小.可以去掉框架窗口的WS_THICKFRAME风格来使窗口不可改变大小,可以选择性的去掉WS_MAXIMIZEBO风格。也可以处理WM_GETMINMAXINFO消息来限制视图的大小。
    179 CSpinButtonCtrl:http://www.ruanxun.com/HArticle78020.aspx
    180 限制用户调整窗口的最大、最小尺寸,在窗口的WM_GETMINMAXINFO消息响应函数中处理,如:
    ---------------------------------------------------------------------------
    void CQQDlg::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
    {
    // TODO: Add your message handler code here and/or call default
    lpMMI->ptMinTrackSize.x=200;   //限制最小宽度,单位为像素,下同
    lpMMI->ptMinTrackSize.y=400;   //限制最小高度
    lpMMI->ptMaxTrackSize.x=250;   //限制最大宽度
    lpMMI->ptMaxTrackSize.y=500;   //限制最大高度
    CDialog::OnGetMinMaxInfo(lpMMI);
    }
    ---------------------------------------------------------------------------
    181 获取桌面所有图标的标题,代码示范了如何使用VirtualAlloc(),WriteProcessMemory() 和 ReadProcessMemory() 在不同的进程中分配内存。用Windows的消息获得图标的名称:
       下载源码:http://www.vckbase.com/code/listcode.asp?mclsid=1&sclsid=101&page=6
    182 一台机器可能有不止一个CD-ROM驱动器。现在CD-ROM已经是PC机的标准配置,此外再装个可擦写的光盘驱动,甚至是DVD都是很常见的事情。不管一台机器上装多少个不同的驱动器,如何找到它们呢?下载源码:http://www.vckbase.com/code/listcode.asp?mclsid=1&sclsid=101&page=6
    183 做一个类似文件快捷方式中查找目标的功能,Net 2003中的MSDN,找到了可以实现该功能的API,SHOpenFolderAndSelectItems()函数.....本程序可以调用Explore打开指定文件夹,并把指定文件置为选定状态,下载源码:http://www.vckbase.com/code/listcode.asp?mclsid=1&sclsid=101           
    184 字符串转为Unicode:
    -----------------------------------------------------------------
    WCHAR wsz[MAX_PATH];
    CString str="字符串";
    #ifdef _UNICODE
    wcscpy(wsz, str);   //如果工程支持Unicode的话用wcscpy函数
    #else
    //工程不支持的话用MultiByteToWideChar函数转换
    MultiByteToWideChar(CP_ACP, 0, str, -1, wsz, MAX_PATH);
    #endif
    -----------------------------------------------------------------
       也可以用c的函数库的函数:
    mbtowc                 转一个字符
    mbstowcs               转字符串
    185 向一个进程外窗口发送WM_SHOWWINDOW消息,隐藏或显示该窗口:
    -----------------------------------------------------
    HWND hwnd=::FindWindow(0,"ddd"); //隐藏"ddd"窗口
    ::PostMessage(hwnd,WM_SHOWWINDOW,FALSE,SW_OTHERZOOM);    //参数3为FALSE时隐藏,为TRUE则显示该窗口
    -----------------------------------------------------
    上面代码有可能失败,因为WM_SHOWWINDOW只是窗口准备改变状态时,系统发出的消息,并不能控制窗口状态的改变。另一个方法可以把后面一句改成:ShowWindow(hwnd,SW_HIDE);
    186 使用24位色彩图标的工具条,有源码范例的:http://www.codeguru.com/Cpp/controls/toolbar/article.php/c2537
    187 设置CListCtrl控件图标间距离的方法:CListCtrl::SetIconSpacing
    188 设置层叠窗口的透明色函数:SetLayeredWindowAttributes,部分代码参考:
    -------------------------------------------------------------------------
    SetWindowLong(this->m_hWnd,GWL_EXSTYLE,GetWindowLong(this->m_hWnd,GWL_EXSTYLE)|WS_EX_LAYERED);
    HWND hWnd=this->m_hWnd;
    typedef DWORD (WINAPI *PSLWA)(HWND, DWORD, BYTE, DWORD);
    PSLWA pSetLayeredWindowAttributes;
    HMODULE hDLL = LoadLibrary ("user32");
    pSetLayeredWindowAttributes = (PSLWA) GetProcAddress(hDLL,"SetLayeredWindowAttributes");
    if (pSetLayeredWindowAttributes != NULL)
    {
    pSetLayeredWindowAttributes (hWnd,0,20,LWA_ALPHA);
    }
    FreeLibrary(hDLL);
    -------------------------------------------------------------------------
    189 关于滚动条方面的,GetScrollInfo获得滚动条位置信息:
    ------------------------------------
    SCROLLINFO si;
    ZeroMemory(&si, sizeof(si));
    si.cbSize = sizeof(si);
    si.fMask = SIF_TRACKPOS;
    // Call GetScrollInfo to get current tracking position in si.nTrackPos
    GetScrollInfo(hwnd, SB_HORZ, &si);
    -----------------------------------
    让滚动条滚动需要发送相应的WM_VSCROLL和WM_HSCROLL消息:
    SendMessage (hwnd, WM_VSCROLL, SB_TOP, 0) ;
    SetScrollInfo函数改变滚动条的位置。
    190 切换到软键盘:call ImmSetConversionStatus with IME_CMODE_SOFTKBD
    191 用SetVolumeLabel函数修改U盘卷标时据说windows会刷新里面的内容。              <===================还没试
    192 基于对话框的MFC程序想要具有打印功能:http://community.csdn.net/Expert/topic/4557/4557847.xml?temp=.5908472
    193 打开那个标题为"打开方式..."的对话框来选择程序:WinExec("rundll32.exe shell32.dll,OpenAs_RunDLL path\filename",SW_RESTORE);
    194 如何屏蔽主窗口的最大化按钮,并让其自动最小化:http://community.csdn.net/Expert/topic/4563/4563807.xml?temp=.9465906
    195 从立体声的wave文件中分别提出左声道和右声道的声音数据,实现音频文件的播放——单声道录音、立体声录音并保存为.wav文件,以及VC.NET简单实现GIF动画:
    http://www.vckbase.com/code/listcode.asp?mclsid=7
    196 DirectX Input获得鼠标输入:http://www.vckbase.com/code/listcode.asp?mclsid=7&sclsid=&page=2
    197 数字水印算法的实现:http://www.vckbase.com/code/listcode.asp?mclsid=7&sclsid=&page=3
    198 程序如何加入全局热键:RegisterHotKey注册热键,响应WM_HOTKEY消息来截获热键:http://www.xiaozhou.net/cooldog/blogview.asp?logID=78
    199 读取其它进程内存中的数据:ReadProcessMemory
    200 给程序加上系统托盘图标:http://www.vckbase.com/bbs/prime/viewprime.asp?id=260
    下面是简单的代码:
    --------------------------------------------------------------
    NOTIFYICONDATA nid;
    //初始化系统托盘图标
    nid.cbSize = sizeof(NOTIFYICONDATA);
    nid.hWnd = m_hWnd;
    nid.uID = 100;
    nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
    nid.uCallbackMessage = WM_USER+20;
    nid.hIcon=LoadIcon(NULL,IDI_APPLICATION); //图标
    strcpy(nid.szTip, "My Tooltip Text");      //提示
    Shell_NotifyIcon(NIM_ADD, &nid);
    --------------------------------------------------------------

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/snow_ice11111/archive/2006/04/10/552696.aspx

    作者:BuildNewApp
    出处:http://syxchina.cnblogs.comBuildNewApp.com
    本文版权归作者、博客园和百度空间共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则作者会诅咒你的。
    如果您阅读了我的文章并觉得有价值请点击此处,谢谢您的肯定1。
  • 相关阅读:
    K2路由器刷机教程
    GitBook Editor使用教程
    source tree使用教程
    github与github网站push神器
    tgp助手开启逆战游戏无反应
    如何计算服务器指标参数
    排序--堆排序算法
    排序--希尔排序算法
    排序--直接插入排序算法
    排序--冒泡排序算法
  • 原文地址:https://www.cnblogs.com/syxchina/p/2197711.html
Copyright © 2011-2022 走看看