欢迎各路好手积极提供,帮助新人
任何有关vc的知识点,小窍门都可以

解决方案 »

  1.   

    1.使用ModifyStyleEx改变了控件风格无效
    答:修改之后,重绘一次,如果还不行的话,再试试看调用SetWindowPos(0,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE | SWP_DRAWFRAME);2.动态设置编辑框的ES_PASSWORD无效
    答:修改之后,需要调用一次SetPasswordChar('*');3.如何获取任务栏小图标?
    答:有网友提出,能不能在程序界面上显示当前的托盘图标,这样更直观一些。这一点我也曾想到过,也知道奥秘就在TBBUTTON这个结构体的dwData域里面,可惜这个域的结构在MSDN中没有描述。我也曾试着发送TB_GETIMAGELIST消息获取image list的句柄,然后用CImageList::FromHandle加载到CImageList中,但却都失败了。
    在csdn网友的帮助下,我弄清了dwData的结构,其实dwData有一个这样的机构,我们命名为TRAYDATA:
    struct TRAYDATA 

        HWND hwnd;                   
        UINT uID;                
        UINT uCallbackMessage;       
        DWORD Reserved[2];           
        HICON hIcon;                //托盘图标的句柄 
    };  
    要获取到这个hIcon,其实很简单:
    //分配虚拟内存 
    lngAddress = VirtualAllocEx(hProcess,  NULL,  sizeof(TBBUTTON), MEM_COMMIT, PAGE_READWRITE);    
    //将hProcess进程内,地址为lngAddress中的内容(大小为sizeof(TBBUTTON))获取到tb中 
    ret = ::ReadProcessMemory(hProcess, LPVOID(long(lngAddress)), &tb, sizeof(TBBUTTON), 0); 
    //将hProcess进程内,地址为tb.dwData中的内容(大小为sizeof(TRAYDATA))获取到tray中 
    ret = ::ReadProcessMemory(hProcess, LPVOID(tb.dwData), &tray, sizeof(TRAYDATA), 0); 
    然后就可以用tray.hIcon索引到这个图标句柄了
    //释放内存代码略4.BeginWaitCursor和EndWaitCursor无效
    答:SetCapture();BeginWaitCursor();....EndWaitCursor();ReleaseCapture();5.打印源码中文件名和行号常用的宏名是什么? 
    答:文件名:__FILE__  行号:__LINE__ 6.如何具体判断一个字符串中哪个是英文字母
    答:函数isalpha7.在注册表中如何得到所有安装了的应用程序程序的信息
    答:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall下面的子鍵8.64位系统下运行32的程序,操作注册表遭遇重定向问题
    答:PVOID   OldValue; 
    HINSTANCE   hlibrary; 
    typedef     int         (__stdcall   *   Wow64DisableWow64FsRedirection)(LPVOID); 
    YWow64DisableWow64FsRedirection   f_Wow64DisableWow64FsRedirection   =   NULL; 
    typedef     int         (__stdcall   *   Wow64RevertWow64FsRedirection)(LPVOID); 
    Wow64RevertWow64FsRedirection   f_Wow64RevertWow64FsRedirection   =   NULL; 
    hlibrary   =   LoadLibrary("Kernel32.dll"); 
    f_Wow64DisableWow64FsRedirection   =   (Wow64DisableWow64FsRedirection)   GetProcAddress(hlibrary,"Wow64DisableWow64FsRedirection"); 
    if(!f_Wow64DisableWow64FsRedirection) { } 
    f_Wow64DisableWow64FsRedirection   (&OldValue); 
    //这里写注册表操作函数,Open的时候要指定   KEY_WOW64_64KEY标志 
    f_Wow64RevertWow64FsRedirection   =   (Wow64RevertWow64FsRedirection)   GetProcAddress(hlibrary,"Wow64RevertWow64FsRedirection"); 
    if(!f_Wow64RevertWow64FsRedirection) { } 
    f_Wow64RevertWow64FsRedirection   (OldValue); 
    FreeLibrary(hlibrary);9.怎么使用系统默认浏览器在新窗口打开网页
    答:ShellExecute是我们常用的一个API,可以运行程序,打开网页。
    ShellExecute(NULL,   "open",   "http://www.csdn.net",   NULL,NULL,SW_SHOWMAXIMIZED);
    这样可以打开一个网页,但不是在新IE中打开,改成下面方式时就可以在一个新的IE中打开网页了
    ShellExecute(NULL,   "open",   "IEXPLORE",   "http://www.csdn.net",NULL,SW_SHOWMAXIMIZED);   10.怎么清除串口的输入缓冲
    答:PurgeComm(hCom,PURGE_TXABORT ¦ PURGE_RXABORT ¦ PURGE_TXCLEAR ¦ PURGE_RXCLEAR);11.显示桌面属性对话框
    答:ShellExecute(GetDesktopWindow()->m_hWnd,"open","control.exe","desk.cpl Display,@Theme","",SW_SHOW );12.限制Edit只能输入0-F
    答:WNDPROC wpOrigEditProc; 
    LRESULT CALLBACK wpSubclassEditProc(HWND hDlg,UINT uiMsg,WPARAM wParam,LPARAM lParam);
    wpOrigEditProc = (WNDPROC) SetWindowLong(GetDlgItem(IDC_EDIT_DATA)->m_hWnd, 
                    GWL_WNDPROC, (LONG) wpSubclassEditProc); 
    LRESULT CALLBACK wpSubclassEditProc(HWND hDlg,UINT uiMsg,WPARAM wParam,LPARAM lParam)
    {
     switch(uiMsg)
     {
     case WM_CHAR:
      if((wParam >= 0x30 && wParam <= 0x39) || 
         (wParam >= 0x41 && wParam <= 0x46) ||
         (wParam >= 0x61 && wParam <= 0x66) ||
         (wParam == 0x08) || wParam == 0x20 || wParam == 0x0D)
      {
       return CallWindowProc(wpOrigEditProc,hDlg,uiMsg,wParam,lParam);
      }
      else
      {
       if(GetKeyState(VK_CONTROL) & 0x8000)
       {
        return CallWindowProc(wpOrigEditProc,hDlg,uiMsg,wParam,lParam);
       }
       return true;
      }
      break;
     }
     return CallWindowProc(wpOrigEditProc,hDlg,uiMsg,wParam,lParam);
      

  2.   

    多上CODEPROJECT这个网站,里面有很多现成的代码可以学习和使用,值得新人多去
      

  3.   


    看收集到的数量把,太少的话,分也没意义
    而且以前vc区也有了一本电子书 vc/mfc编程经验指南
      

  4.   


    //一些帮助函数//返回当前程序的路径
    //例如c:\abc\abc.exe则返回c:\abc
    BOOL GetPath(TCHAR * strPath)
    {
    TCHAR sDrive[_MAX_DRIVE];
    TCHAR sDir[_MAX_DIR];
    TCHAR sFilename[_MAX_FNAME],Filename[_MAX_FNAME];
    TCHAR sExt[_MAX_EXT];

    GetModuleFileName(NULL, Filename, _MAX_PATH);
    _tsplitpath(Filename, sDrive, sDir, sFilename, sExt);

    _tcscpy(strPath,sDrive);
    _tcscat(strPath,sDir); strPath[_tcslen(strPath)-1] = _T('\0');

    return TRUE;
    }//获得父进程ID,失败则返回0
    DWORD   GetPPid()   
    {           
    HANDLE hProcessSnap   =   NULL;     
    PROCESSENTRY32 pe32 = {0};
    DWORD dwPID = GetCurrentProcessId();

    hProcessSnap   =   CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,   0);     
        
    if(hProcessSnap==(HANDLE)-1)     
    return   (FALSE);      pe32.dwSize   =   sizeof(PROCESSENTRY32);     

    if   (Process32First(hProcessSnap,   &pe32))     
    {   
    while(pe32.th32ProcessID!=dwPID)   
    Process32Next(hProcessSnap,   &pe32);   


    CloseHandle(hProcessSnap);

    return(pe32.th32ParentProcessID);   
    }//判断程序是否以服务运行
    BOOL isRuninServices()
    {
    DWORD dwPPID = GetPPid(); HANDLE hProcessSnap   =   NULL;     
    PROCESSENTRY32   pe32  =   {0};     
      
    hProcessSnap   =   CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,   0);     
        
    if   (hProcessSnap   ==   (HANDLE)-1)     
    return   (FALSE);     
       
    pe32.dwSize   =   sizeof(PROCESSENTRY32);     

    if   (Process32First(hProcessSnap,   &pe32))     
    {   
    while(pe32.th32ProcessID!=dwPPID)   
    Process32Next(hProcessSnap,   &pe32);   


    CloseHandle(hProcessSnap); if(_tcsncicmp(pe32.szExeFile,_T("services.exe"),20)==0)
    return TRUE;
    else return FALSE;}//提升为调试权限
    BOOL EnableDebugPrivilege(BOOL bEnable) 
    {
    BOOL bOk = FALSE; 
    HANDLE hToken;

    if(::OpenProcessToken(::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) 
    {
    LUID uID;
    ::LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &uID); TOKEN_PRIVILEGES tp;
    tp.PrivilegeCount = 1;
    tp.Privileges[0].Luid = uID;
    tp.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
    ::AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
    bOk = (::GetLastError() == ERROR_SUCCESS); ::CloseHandle(hToken);
    }
    return bOk;
    }//用于在release下输出调试信息
    void KDbgPrint(LPCTSTR lpszFormat, ...)
    {
    #define _countof(array) (sizeof(array)/sizeof(array[0]))
    #ifdef KOUT_DEBUG_STRING 
    va_list args;
    va_start(args, lpszFormat); int nBuf;
    TCHAR szBuffer[512]; nBuf = _vsntprintf(szBuffer, _countof(szBuffer), lpszFormat, args); OutputDebugString(szBuffer); va_end(args);
    #endif
    }//从地址去获得模块基址
    HMODULE WINAPI ModuleFromAddress(PVOID pv)
    {
    MEMORY_BASIC_INFORMATION mbi;
    if(::VirtualQuery(pv, &mbi, sizeof(mbi)) != 0)
    {
    return (HMODULE)mbi.AllocationBase;
    }
    else
    {
    return NULL;
    }
    }//获得DLL自身
    BOOL GetDllPath(TCHAR * path)
    {
    HMODULE hDll = ModuleFromAddress(GetDllPath); if(hDll==NULL)
    return FALSE;
    else
    {
    GetModuleFileName(hDll, path, _MAX_PATH);
    return TRUE;
    }
    }
    //格式化string
    void format_string(string & str,LPCTSTR lpszFormat, ...)
    {
    #define _countof(array) (sizeof(array)/sizeof(array[0]))
    va_list args;
    va_start(args, lpszFormat);

    int nBuf;
    TCHAR szBuffer[1024];

    nBuf = _vsntprintf(szBuffer, _countof(szBuffer), lpszFormat, args);

    str = szBuffer;

    va_end(args);
    }//提升所需的权限
    BOOL EnablePrivilege(LPCTSTR lpName,BOOL bEnable) 
    {
    BOOL bOk = FALSE; 
    HANDLE hToken;

    if(::OpenProcessToken(::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) 
    {
    LUID uID;
    ::LookupPrivilegeValue(NULL, lpName, &uID);

    TOKEN_PRIVILEGES tp;
    tp.PrivilegeCount = 1;
    tp.Privileges[0].Luid = uID;
    tp.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
    ::AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
    bOk = (::GetLastError() == ERROR_SUCCESS);

    ::CloseHandle(hToken);
    }
    return bOk;
    }//跳转到注册表
    void Jump2Reg(string strRegPath,string strKey)
    {
    //ShellExecute(NULL,NULL,"regjump.exe",strRegPath.c_str(),NULL,SW_SHOW);
    ShellExecute(NULL,NULL,"regedit.exe",NULL,NULL,SW_SHOW);

    //然后查找注册表窗口
    HWND hMain = NULL;
    HWND hTree = NULL;
    HWND hList = NULL;
    BOOL bFind = FALSE;

    for(int i=0;i<10;i++)
    {
    hMain = FindWindow("RegEdit_RegEdit","注册表编辑器");

    if(hMain!=NULL)
    {//查找成功
    bFind = TRUE;
    break;
    }

    Sleep(200);
    }

    if(bFind)
    {
    hTree = FindWindowEx(hMain,NULL,"SysTreeView32",NULL);
    hList = FindWindowEx(hMain,NULL,"SysListView32",NULL);

    //选择树
    SetForegroundWindow(hTree);
    SetFocus(hTree);

    DWORD dwPID;
    GetWindowThreadProcessId(hMain,&dwPID);
    HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID);

    //先把树给折叠起,最多30层
    for(int i=0;i<30;i++)
    {
    SendMessage(hTree, WM_KEYDOWN, VK_LEFT, 0);
    }

    SendMessage(hTree, WM_KEYDOWN, VK_RIGHT, 0);
    WaitForInputIdle(hProc, INFINITE);


    for(i=0;i<strRegPath.length();i++)
    {
    if(strRegPath.at(i)=='\\')
    SendMessage(hTree, WM_KEYDOWN, VK_RIGHT, 0);
    else
    SendMessage(hTree,WM_CHAR,WPARAM(strRegPath.at(i)),0);

    }

    WaitForInputIdle(hProc, INFINITE);

    //然后到列表了..
    SetForegroundWindow(hList);
    SetFocus(hList);

    Sleep(1000);

    SendMessage(hList, WM_KEYDOWN, VK_HOME, 0);

    for(i=0;i<strKey.length();i++)
    {
    SendMessage(hList,WM_CHAR,WPARAM(strKey.at(i)),0);
    }

    CloseHandle(hProc);
    }

    return;
    }//////////////////////////////////////////////////////////////////////////
    //显示文件属性
    void ShowProperties(string strPath)
    {
    SHELLEXECUTEINFO si;

    ZeroMemory(&si,sizeof(SHELLEXECUTEINFO));

    si.cbSize = sizeof(SHELLEXECUTEINFO);
    si.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_INVOKEIDLIST | SEE_MASK_FLAG_NO_UI ;
    si.lpVerb = "properties";
    si.lpFile = strPath.c_str();
    si.nShow = SW_SHOW;

    ShellExecuteEx(&si);
    }//定位文件
    void Jump2File(string strPath)
    {
    string cmd = "/e,/select,"+strPath;
    ShellExecute(NULL,NULL,"explorer",cmd.c_str(),NULL,SW_SHOW);
    }
      

  5.   

    http://www.vckbase.com/里有很多
      

  6.   

    本帖最后由 jimoguilai 于 2009-04-09 11:07:05 编辑
      

  7.   

    如何制作透明窗体 
      使用SetLayeredWindowAttributes可以方便的制作透明窗体,此函数在w2k以上才支持,而且如果希望直接使用的话,可能需要下载最新的SDK。不过此函数在w2k的user32.dll里有实现,所以如果你不希望下载巨大的sdk的话,可以直接使用GetProcAddress获取该函数的指针。 
    SetLayeredWindowAttributes的函数原型如下: BOOL SetLayeredWindowAttributes( 
    HWND hwnd, // handle to the layered window 
    COLORREF crKey, // specifies the color key 
    BYTE bAlpha, // value for the blend function 
    DWORD dwFlags // action 
    ); 
    Windows NT/2000/XP: Included in Windows 2000 and later. 
    Windows 95/98/Me: Unsupported.(注意了,在win9x里没法使用的) 
    Header: Declared in Winuser.h; include Windows.h. 
    Library: Use User32.lib. 
    一些常量: 
    WS_EX_LAYERED = 0x80000; 
    LWA_ALPHA = 0x2; 
    LWA_COLORKEY=0x1;   其中dwFlags有LWA_ALPHA和LWA_COLORKEY   LWA_ALPHA被设置的话,通过bAlpha决定透明度.   LWA_COLORKEY被设置的话,则指定被透明掉的颜色为crKey,其他颜色则正常显示.   要使使窗体拥有透明效果,首先要有WS_EX_LAYERED扩展属性(旧的sdk没有定义这个属性,所以可以直接指定为0x80000).   例子代码:   在OnInitDialog()加入: //加入WS_EX_LAYERED扩展属性 
    SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE, 
    GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000); 
    HINSTANCE hInst = LoadLibrary("User32.DLL"); 
    if(hInst) 

     typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD); 
     MYFUNC fun = NULL; 
     //取得SetLayeredWindowAttributes函数指针 
     fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes"); 
     if(fun)fun(this->GetSafeHwnd(),0,128,2); 
     FreeLibrary(hInst); 
    }   稍加修改还可以作出淡出淡入的效果. 注意第三个参数(128)不要取得太小了,为0的话就完全透明,看不到了。 
      

  8.   

    如何使框架窗口的图标为动画显示   可以用TIMER,但是TIMER不能有效的定时。因为TIMER发送的是窗口消息,当窗口忙于处理键盘、鼠标等消息时就不能及时处理TIMER,会使间隔时间变得很长 。   可以考虑用一个单独得TIMER线程,用Sleep()定时来解决此问题。 
    UINT Timer(LPVOID param) 

     HWND hWnd=(HWND)param; 
     while(1) 
     { 
      Sleep(ms); 
      PostMessage(hWnd,CH_PICTURE,NULL,NULL) 
     } 
    }   Sleep(ms)后发送自定义消息。消息处理函数就选择某一个ICON或BITMAP来显示。如 : 
    MyBotton.SetBitmap((HBITMAP)Bitmap[i]);   Bitmap是一个位图数组,存放有j个位图。消息处理函数运行一次,i就累加一次,当i==j时,i就回到0; 
      

  9.   


    http://topic.csdn.net/t/20040204/23/2704357.html这个吧
      

  10.   

    Q 如何处理ComboBox中的回车键?避免退出程序?
    A 在一般的EDIT中采用的方法是处理PretranlateMessage(),执行代码
    CWnd *pWnd = GetFocus();
    if(pWnd != NULL)
    {
      if(pWnd == GetDlgItem(IDC_EDIT1)
      {
         ...//IDC_EDIT1具有焦点
      }
    }
     
    但在ComboBox中好象不同,是ComboBox的编辑控件得到了焦点,所以判断代码:
    BOOL CDlg::PreTranslateMessage(MSG *pMsg)
    {
       if(pMsg->message==WM_KEYDOWN && pMsg->wParam == VK_RETURN)
       {
          CWnd *pWnd = GetFocus();
          if(pWnd != NULL)
          {
             if(pWnd->GetParent() == GetDlgItem(IDC_COMBO1)//更改ID
             {
                   return TRUE;
             }
          }
       }
       return CDialog::PreTranslateMessage(pMsg);
    }//-------------------------------------------------
    Q 动态创建的组合框如何设置下拉列表框的高度?
    A m_combo.Create(WS_CHILD | WS_VISIBLE | WS_VSCROLL CBC_SORT | CBC_DROPDOWNLIST | WS_TABSTOP, CRect(320,10,580,280),this,114);
    //CRect的最后一个参数(这里是280)就表示下拉大小//-------------------------------------------------
    Q 是否能不选择下拉列表样式而禁止用户输入值,有什么方法可以实现?
    A 将下拉列表的编辑控件设置为只读的,方法如下:
    CComboBox *pcombo;
    CWnd *pWnd = pcombo->GetWindow(GW_CHILD);
    while(pWnd)
    {
      char classname[256];
      ::GetClassName(pWnd->m_hWnd,classname,256)
      if(strcmp(classname,"edit") == 0)
      {
         CEdit *pEdit;
         pEdit = new CEdit();
         pEdit->SubClassWindow(pWnd->m_hWnd);
         pEdit->SetReadOnly();
         pWnd = pWnd->GetNextWindow();
         delete pEdit;
      }
      if(pWnd)
         pWnd = pWnd->GetNextWindow();
    }//-------------------------------------------------
    Q ComboBox的自定义弹出菜单,想在右击组合框的编辑部分的时候弹出菜单?
    A 一种方法就是在CCustomCombo的OnCtlColor函数里进行,生成ComboBox中编辑框的子类,示例:
    HBRUSH CCustomCombo::OnCtlColor(CDC *pDC,CWnd *pWnd,UINT nCtlColor)
    {
      if(nCtlColor == CTLCOLOR_EDIT)
      {
         if(m_edit.GetSafeHwnd()==NULL)
            m_eidt.SubClassWindow(pWnd->GetSafeHwnd());
      }
      HBRUSH hbr = CComboBox::OnCtlColor(pDC,pWnd,nCtlColor);
      return hbr;
    }
    //其中m_edit是CEdit类的实现,它在WM_RBUTTONUP上显示右键菜单//-------------------------------------------------
    Q 如何给按钮加位图

    对动态创建的按钮:
    CButton button;
    button.Create(_T("My Button"),WS_CHILD | WS_VISIBLE | BS_BITMAP,CRect(10,10,60,50),pParentWnd,1);
    button.SetBitmap(::LoadBitmap(NULL,MAKEINTRESOURCE(IBM_CHECK)));
    或者修改风格:
    UINT Style = Button.GetButtonStyle();
    Style = Style | BS_BITMAP;
    Button.SetBitmap(::LoadBitmap(NULL,MAKEINTRESOURCE(IBM_CHECK)));//-------------------------------------------------
    Q 如何在CButton派生类中以及父对话框中捕获BN_CLICKED消息?
    A 于WM_NOTIFY消息相反,通知消息BN_CLICKED作为WM_COMMAND消息发送。因此应用程序应该使用ON_CONTROL_REFLECT_EC而不是ON_NOTIFY_REFLECT//-------------------------------------------------
    Q 如何判断某个对象是否具有当前焦点?
    A return (CWnd::GetFocus() == pWnd);//-------------------------------------------------
    Q 如何设置编辑控件的数字限制属性?
    A
    long Style = GetWindowLong(m_EditCtrl.m_hWnd,GWL_STYLE);
    Style |= ES_NUMBER;
    SetWindowLong(m_EditCtrl.m_hWnd,GWL_STYLE,Style);//-------------------------------------------------
    Q 希望在LISTCTRL中显示文件,如何才能得到explorer使用的相同图象?
    A 可以将系统的ImageList加到LISTCTRL上,然后用具有SHGFI_ICON标志的SHGetFileInfo获取适当的图标索引:
    //图象列表设置
    HIMAGELIST himagelist;
    SHFILEINFO fi;
    CImageList m_smalllist;
    //得到系统小图标列表的句柄
    himagelist = (HIMAGELIST)SHGetFileInfo((LPCTSTR)_T("C:\\"),0,&fi,sizeof(SHFILEINFO),SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
    //添加到小图象列表
    m_smalllist.Attach(himagelist);
    //设置LISTCTRL的图象列表
    m_listCtrl.SetImageList(&m_smalllist,LVSIL_SMALL);
    //分离图象列表
    m_smalllist.Detach();//-------------------------------------------------
    Q 如何在列表的任何一列显示图标,而不是第一列?

    LV_ITEM item;
    ...
    item.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE | LVIF_PARAM;
    item.iItem = ...//设置行号
    item.lParam = ...//如何需要就设置lparam参数
    item.iSubItem = ...//设置列号,从0开始的
    item.stateMask = LVIS_STATEIMAGEMASK;
    item.state = INDEXTOSTATEIMAGEMASK(...);//参数为图标号
    item.iImage = ...//设置图标号
    item.pszText = ...//显示文本
    //插入新项
    m_listctrl.InsertItem(&item);
    //现在设置图标
    m_listctrl.SetItemText(0,4,szField);//-------------------------------------------------
    Q 给LISTBOX添加新项时如何实现自动下滚?
    A 在调用AddString后,添加如下代码:
    m_listbox.SetTopIndex(m_listbox.GetCount()-1);//-------------------------------------------------
    Q listBox的文本超过框的宽度时,如何让水平滚动条正常工作?
    A 用下面的代码,设置滚动条的宽度为最长的字符串宽度
    void SetHorizontalExtent(CListBox &listbox)
    {
        int index = listbox.GetCount();
        if(index == LB_ERROR)
           return;
        int nExtent = 0;
        if(index)
        {
            CDC *pDC = listbox.GetDC();
     CFont *poldfont = pDC->SelectObject(listbox.GetFont());
     CString s;
     SIZE text;
     LONG maxtxt = 0;
     whilw(index--)
     {
                 listbox.GetText(index,s);
          text = pDC->GetOutputTextExtent(s);
          if(text.cx > maxtxt)
                     maxtxt = text.cx;
      }
            text.cx = maxtxt;
          pDC->LPToDP(&text);
          nExtent = text.cx+2;
          pDC->SelectObject(poldfont);
          listbox.ReleaseDC(pDC);
        }   
        listbox.SetHorizontalExtent(nExtent);
    }//-------------------------------------------------
      

  11.   

    Q 在拆分视图的时候,创建了四个视图(2行2列),右下的是CFormView,其他的都是CView,在CMainFrame的OnCreateCilent不管怎么指定CRect的大小,下方的两个视图都占了整个窗口,需要拖动!
    A 一般只需要在OnCreateClient的末尾添加:
    m_wndSpitter.SetRowInfo(0,200,0);//添加此行代码//-------------------------------------------------
    Q 如何指定拆分窗口的最小宽度?
    A 使用CSpitterWnd::SetColumnInfo()
      void SetColumnInfo(int col, //指定列
           int deal, //理想宽度(像素)
           int cxmin); //最小宽度(像素)
     在使用SetColumnInfo之后还应该调用RecalLayout();重新调整布局。
      
    //--------------------------------------------------
    Q 如何判断工具栏是水平还是垂直的?
    A if((m_toolbar.GetBarStyle() & CBRS_ALIGN_LEFT) == CBRS_ALIGN_LEFT || (m_toolbar.GetBarStyle() & CBRS_ALIGN_RIGHT) == CBRS_ALIGN_RIGHT)
         AfxMessageBox("vertical");
      else
         AfxMessageBox("horizontal");//--------------------------------------------------
    Q 编程方式修改工具栏按钮的可见性?
    A 示例代码:
    DWORD style = m_toolbar.GetButtonStyle(nIndex);
    if(m_bHide)
       m_toolbar.SetButtonStyle(nIndex,style & ~WS_VISIBLE);
    else
       m_toolbar.SetButtonStyle(nIndex,style | WS_VISIBLE);
    m_bHide = !m_bHide;//--------------------------------------------------
    Q 如何在状态栏添加按钮并响应?
    A 创建一个从CButton派生的CMyButton类,在主框架类添加CMyButton类的成员变量,然后在OnCreate函数中创建按钮,并把它和状态栏关联起来:
    m_mybtn.Create("MyButton",WS_CHILD | VISIBLE,CRect(0,0,60,20),&m_WndStatusBar,0);
    通过处理BN_CLICKED消息,可以在CMyButton类中处理所有的点击事件//--------------------------------------------------
    Q 如何隐藏属性CPropertySheet的标题栏,使用ModifyStyle(WINDOW_CAPTION,0)没有效果
    A 创建自己的CPropertySheet派生类,并覆盖OnInitDialog,转到默认的情况后,使用ModifyStyle来删除WS_CAPTION标志//--------------------------------------------------
    Q 如何让属性页有两行标签?
    A 从CPropertySheet派生类,添加PreCreateWindow的处理,在调用基类之前添加代码:
     cs.style |= TCS_MULTILINE;//------------------------------------------------------
    Q 如何在属性表的两个页之间传递数据?

    CPropertyPage有一个成员函数QuerySiblings(WPARAM, LPARAM)。应用程序可以使用这个函数。
    QuerySiblings生成一条PSM_QUERYSIBLINGS消息,它传递给所有的兄弟,也就是属性表上的其他属性页。   一般可创建一个所有页可见的枚举,如:
     enum{QUERY_MY_STRING,  QUERY_SOMETHING_ELSE,.......}
    然后,在一个属性页需要其他属性页中的信息时,使用代码:
    CString myString;
    if(lL == QuerySiblings(QUERY_MY_STRING,(LPARAM)&myString))
    {
             ....//获取字符串
    }
    提供字符串的页处理PSM_QUERYSIBLINGS消息:
    LRESULT CPageThatHasString::OnQuerySiblings(WPARAM wParam, LPARAM lParam)
    {
            if(QUERY_MY_STRING == wParam)
           {
                  *((CString *)lParam) = _T(“Test String“);
                   return 1L;
           }
           else
                  return 0L;
    }//----------------------------------------------------------
    Q  如何让属性页具有两行标签?
    A  
    从CPropertySheet派生一个自己的类,添加一个PreCreateWindow的处理,然后在调用基类的处理前加如下代码:cs.style |= TCS_MULTILINE;//-----------------------------------------------------------
    Q  如何隐藏属性页的标题栏?
    A  
    从CPropertySheet派生一个自己的类,并覆盖OnInitDialog,在转到默认的情况以后,使用 ModifyStyle来删除标题栏标志WS_CAPTION。
       ModifyStyle(WS_CAPTION,0);//-------------------------------------------------------------------
    Q 如何枚举桌面项目?
    A
    1 得到指向IShellFolder接口的指针
    2 得到指向IMalloc接口的指针
    3 得到指向IEnumIDList接口的指针
    4 提取枚举中下一项目的PIDL
    5 测定PIDL代表的标志符的类型
    6 处理该项目
    7 释放PIDL分配的内存
    8 重复4到7步,知道所有的项目都枚举完
    9 释放IShellFolder IMalloc IEnumIDList接口的指针LPSHELLFOLDER lpshellfolder;
    LPMALLOC lpmalloc;
    LPENUMIDLIST lpidlist;
    m_namecount = 0;
    HRESULT hr = SHGetDestopFolder(&lpshellfolder);
    if(hr == NOERROR)
    {
        hr = ::SHGetMalloc(&lpmalloc);
        if(hr == NOERROR)
        { 
            hr = lpshellfolder->EnumObject(NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS,&lpidlist);
            if(hr == NOERROR)
                 ProcessFolder(lpshellfolder,lpmalloc,lpidlist);//custom deal function
            lpmalloc->Release();
            lpidlist->Release();
            InValidate();
        }
        lpshellfolder->Release();
    }
     
    void ***::ProcessFolder(LPSHELLFOLDER lpshellfolder,LPMALLOC lpmalloc,LPENUMIDLIST lpidlist)
    {
       STRRET strret;
       ULONG numfetch;
       LPITEMIDLIST lpitemlist;
       HRESULT hr = lpidlist->Next(1,&lpitemlist,&numfetch);
       while(hr == NOERROR)
       {
           ULONG attributes = SFGAO_FOLDER;
           lpshellfolder->GetAttributes(1,(const struct _ITEMIDLIST **)&lpitemlist,&attributes);
           if(attributes & SFGAO_FOLDER)
           {
               hr = lpshellfolder->GetDiaplayNameOf(lpitemlist,SHGDN_NORMAL,&strret);
               if(m_nameCount < 20)
                   m_names[m_namecount++] = strret.str;
           }
           lpmalloc->Free(lpitemlist);
           hr = lpidlist->Next(1,&lpitemlist,&numfetch);
       }
    }
    //-------------------------------------------------------------------
    Q  如何创建桌面快捷方式?
    A:
    1 initialize com
    2 create LShellLink Object
    3 Use IShellLink interface to get the pointer about IPersistFile
    4 Use IShellLink interface to initialize link
    5 Use LPersistFile interface to save the link
    6 Release all the com pointer
    7 Com return to previous status1 
    HRESULT hr = CoInitialize(NULL);
    if(hr == S_OK)
    {
      ...//Continue
    }2
    IShellLink *pshelllink;
    pshelllink = CoCreateInstance(CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,IID_IShellLink,(void **)&pshelllink);3
    IPersistFile *persistfile;
    persistfile = pshelllink->QueryInterface(IID_IPersistFile,(void **)&persistfile);4
    pshelllink->SetPath("C:\\config.sys"); 
    pshelllink->SetDescription("ShortCut to config.sys");5
    char path[MAX_PATH];
    GetWindowsDirectory(path,MAX_PATH);
    int len = strlen(path);
    strcpy(&path[len],"\\desktop\\config.lik");
    //change the char from ANSI to UNICODE
    OLECHAR widepath[MAX_PATH];
    MultiByteToWideChar(CP_ACP,0,path,-1,widepath,MAX_PATH);
    persistfile->Save(widepath,TRUE);6
    pshelllink->Release();
    psersistfile->Release();7
    CoUnInitialize();有部分代码有点错误,但修改容易
      

  12.   

    Q 在拆分视图的时候,创建了四个视图(2行2列),右下的是CFormView,其他的都是CView,在CMainFrame的OnCreateCilent不管怎么指定CRect的大小,下方的两个视图都占了整个窗口,需要拖动!
    A 一般只需要在OnCreateClient的末尾添加:
    m_wndSpitter.SetRowInfo(0,200,0);//添加此行代码//-------------------------------------------------
    Q 如何指定拆分窗口的最小宽度?
    A 使用CSpitterWnd::SetColumnInfo()
      void SetColumnInfo(int col, //指定列
           int deal, //理想宽度(像素)
           int cxmin); //最小宽度(像素)
     在使用SetColumnInfo之后还应该调用RecalLayout();重新调整布局。
      
    //--------------------------------------------------
    Q 如何判断工具栏是水平还是垂直的?
    A if((m_toolbar.GetBarStyle() & CBRS_ALIGN_LEFT) == CBRS_ALIGN_LEFT || (m_toolbar.GetBarStyle() & CBRS_ALIGN_RIGHT) == CBRS_ALIGN_RIGHT)
         AfxMessageBox("vertical");
      else
         AfxMessageBox("horizontal");//--------------------------------------------------
    Q 编程方式修改工具栏按钮的可见性?
    A 示例代码:
    DWORD style = m_toolbar.GetButtonStyle(nIndex);
    if(m_bHide)
       m_toolbar.SetButtonStyle(nIndex,style & ~WS_VISIBLE);
    else
       m_toolbar.SetButtonStyle(nIndex,style | WS_VISIBLE);
    m_bHide = !m_bHide;//--------------------------------------------------
    Q 如何在状态栏添加按钮并响应?
    A 创建一个从CButton派生的CMyButton类,在主框架类添加CMyButton类的成员变量,然后在OnCreate函数中创建按钮,并把它和状态栏关联起来:
    m_mybtn.Create("MyButton",WS_CHILD | VISIBLE,CRect(0,0,60,20),&m_WndStatusBar,0);
    通过处理BN_CLICKED消息,可以在CMyButton类中处理所有的点击事件//--------------------------------------------------
    Q 如何隐藏属性CPropertySheet的标题栏,使用ModifyStyle(WINDOW_CAPTION,0)没有效果
    A 创建自己的CPropertySheet派生类,并覆盖OnInitDialog,转到默认的情况后,使用ModifyStyle来删除WS_CAPTION标志//--------------------------------------------------
    Q 如何让属性页有两行标签?
    A 从CPropertySheet派生类,添加PreCreateWindow的处理,在调用基类之前添加代码:
     cs.style |= TCS_MULTILINE;//------------------------------------------------------
    Q 如何在属性表的两个页之间传递数据?

    CPropertyPage有一个成员函数QuerySiblings(WPARAM, LPARAM)。应用程序可以使用这个函数。
    QuerySiblings生成一条PSM_QUERYSIBLINGS消息,它传递给所有的兄弟,也就是属性表上的其他属性页。   一般可创建一个所有页可见的枚举,如:
     enum{QUERY_MY_STRING,  QUERY_SOMETHING_ELSE,.......}
    然后,在一个属性页需要其他属性页中的信息时,使用代码:
    CString myString;
    if(lL == QuerySiblings(QUERY_MY_STRING,(LPARAM)&myString))
    {
             ....//获取字符串
    }
    提供字符串的页处理PSM_QUERYSIBLINGS消息:
    LRESULT CPageThatHasString::OnQuerySiblings(WPARAM wParam, LPARAM lParam)
    {
            if(QUERY_MY_STRING == wParam)
           {
                  *((CString *)lParam) = _T(“Test String“);
                   return 1L;
           }
           else
                  return 0L;
    }//----------------------------------------------------------
    Q  如何让属性页具有两行标签?
    A  
    从CPropertySheet派生一个自己的类,添加一个PreCreateWindow的处理,然后在调用基类的处理前加如下代码:cs.style |= TCS_MULTILINE;//-----------------------------------------------------------
    Q  如何隐藏属性页的标题栏?
    A  
    从CPropertySheet派生一个自己的类,并覆盖OnInitDialog,在转到默认的情况以后,使用 ModifyStyle来删除标题栏标志WS_CAPTION。
       ModifyStyle(WS_CAPTION,0);//-------------------------------------------------------------------
    Q 如何枚举桌面项目?
    A
    1 得到指向IShellFolder接口的指针
    2 得到指向IMalloc接口的指针
    3 得到指向IEnumIDList接口的指针
    4 提取枚举中下一项目的PIDL
    5 测定PIDL代表的标志符的类型
    6 处理该项目
    7 释放PIDL分配的内存
    8 重复4到7步,知道所有的项目都枚举完
    9 释放IShellFolder IMalloc IEnumIDList接口的指针LPSHELLFOLDER lpshellfolder;
    LPMALLOC lpmalloc;
    LPENUMIDLIST lpidlist;
    m_namecount = 0;
    HRESULT hr = SHGetDestopFolder(&lpshellfolder);
    if(hr == NOERROR)
    {
        hr = ::SHGetMalloc(&lpmalloc);
        if(hr == NOERROR)
        { 
            hr = lpshellfolder->EnumObject(NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS,&lpidlist);
            if(hr == NOERROR)
                 ProcessFolder(lpshellfolder,lpmalloc,lpidlist);//custom deal function
            lpmalloc->Release();
            lpidlist->Release();
            InValidate();
        }
        lpshellfolder->Release();
    }
     
    void ***::ProcessFolder(LPSHELLFOLDER lpshellfolder,LPMALLOC lpmalloc,LPENUMIDLIST lpidlist)
    {
       STRRET strret;
       ULONG numfetch;
       LPITEMIDLIST lpitemlist;
       HRESULT hr = lpidlist->Next(1,&lpitemlist,&numfetch);
       while(hr == NOERROR)
       {
           ULONG attributes = SFGAO_FOLDER;
           lpshellfolder->GetAttributes(1,(const struct _ITEMIDLIST **)&lpitemlist,&attributes);
           if(attributes & SFGAO_FOLDER)
           {
               hr = lpshellfolder->GetDiaplayNameOf(lpitemlist,SHGDN_NORMAL,&strret);
               if(m_nameCount < 20)
                   m_names[m_namecount++] = strret.str;
           }
           lpmalloc->Free(lpitemlist);
           hr = lpidlist->Next(1,&lpitemlist,&numfetch);
       }
    }
    //-------------------------------------------------------------------
    Q  如何创建桌面快捷方式?
    A:
    1 initialize com
    2 create LShellLink Object
    3 Use IShellLink interface to get the pointer about IPersistFile
    4 Use IShellLink interface to initialize link
    5 Use LPersistFile interface to save the link
    6 Release all the com pointer
    7 Com return to previous status1 
    HRESULT hr = CoInitialize(NULL);
    if(hr == S_OK)
    {
      ...//Continue
    }2
    IShellLink *pshelllink;
    pshelllink = CoCreateInstance(CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,IID_IShellLink,(void **)&pshelllink);3
    IPersistFile *persistfile;
    persistfile = pshelllink->QueryInterface(IID_IPersistFile,(void **)&persistfile);4
    pshelllink->SetPath("C:\\config.sys"); 
    pshelllink->SetDescription("ShortCut to config.sys");5
    char path[MAX_PATH];
    GetWindowsDirectory(path,MAX_PATH);
    int len = strlen(path);
    strcpy(&path[len],"\\desktop\\config.lik");
    //change the char from ANSI to UNICODE
    OLECHAR widepath[MAX_PATH];
    MultiByteToWideChar(CP_ACP,0,path,-1,widepath,MAX_PATH);
    persistfile->Save(widepath,TRUE);6
    pshelllink->Release();
    psersistfile->Release();7
    CoUnInitialize();有部分代码有点错误,但修改容易
      

  13.   


    一、新建一个类,已经保存,为何有时候在"ClassView"里看不到这个类?
    答:菜单[工程]->[添加到工程...]->[文件...]添加XXXClass.h和.cpp文件,如果在"ClassView"里还是看不到,"FileView"里找到XXXClass.h文件,在class CXXXClass的CXXXClass这个地方任意改变类名,此时就看到了,之后再改变为CXXXClass.二、怎么改变对话框上各控件的tab顺序?
    答:在资源视图,对话框IDD_DIALOG1下,按Ctrl+D,看到各个控件前有个数字,这个数字便是TAB键顺序,按照你要求重新排序这些数字便可。三、在使用COMBOBOX时,怎么设置当弹出下拉列表框时的高度?
    答:在资源视图,找到IDC_COMBOBOX1,单击“箭头”,此时调整个高度便是下拉列表框可见时的高度,如果是动态create出来的,参数rect的高便是下拉列表框可见时的高,而CComboBox::SetItemHeight(-1, 15)为设置组合框高度。四、在IDC_LIST1与CListCtrl m_list关联后,有时输入m_list.后并没有智能提示出CListCtrl的函数是怎么回事?
    答:是VC开发环境的BUG,我个人的解决方法是先用CXXXClass::出现提示后定位选择函数,再把CXXXClass::换成变量名.这个问题希望有朋友可以解答下。五、在用TabCtrl控件时,为何不可以按标签页来定制某页上的控件?
    答:VC的TabCtrl不支持这样的操作,方法是先建立一对话框资源IDD_DIALOGX(跟工程无关的),把某标签页上所有控件调整大小并排版,然后全选粘贴在工程中正式的对话框IDD_DIALOG1中,反复这样的操作,tabctrl有几页就招待几次,最后再添加TabCtrl在IDD_DIALOG1中,然后通过将IDC_TABCTRL1与CTabCtrl m_tab1关联,之后添加IDC_TABCTRL1的TCN_SELCHANGE消息处理函数,便可用int nPage = m_tab1.GetCurSel()取得当前标签号,接着再用switch(nPage)来选择处理各页显示的控件,控件显示可用ShowWindow(SW_SHOW/SW_HIDE)来控制,小技巧,在第一步时,可有意识的将第某页上的控件ID设为IDC_TAB1_NAME,IDC_TAB2_NAME,这样的形式,便于清楚的知道哪个控件是第几页中的。先吃饭了,等想想再来。
      

  14.   

    nanshanyitiaochong 各位大哥大姐,帮帮小弟.我现在正在学asp.net做网站,候了解一下,怎么才能用自已的写的代码建一个网站,越详细越好.在这里先谢谢各位了nanshanyitiaochong 各位大哥大姐,帮帮小弟.我现在正在学asp.net做网站,候了解一下,怎么才能用自已的写的代码建一个网站,越详细越好.在这里先谢谢各位了
      

  15.   

    我新装的VC,但是却经常没有智能感应功能(就是能够自动弹出类成员的列表),如何设置?tools   ->   option   ->Editon   
      最下面的的autolist   member要是和你说的一样是经常没有,而不是始终没有。   
      那就把你的工程目录下的XXX.ncb文件删掉,再打开工程就可以了。
      

  16.   

    VC在哪定义全局结构体变量?
    在stdafx.h里定义结构体,并声明全局变量,并在stdafx.cpp里面定义全局变量注意不要在stdafx.h开头定义结构体,要在合适的地方定义
    如果你的结构体包含了一些其它MFC类
      

  17.   

    链接时提示找不到./Debug/Stdafx.obj先单独编译Stdafx.cpp,然后再编译整个工程
      

  18.   

    怎么把程序放到没有装VC的机器上跑1 放到目标机器上运行,提示缺少什么dll则在开发机器上搜索出来,添加到目标机
    2 将程序设置成使用静态链接库 [Project] --> [Settings] 
      

  19.   

    明明某个函数在某个头文件里面,但是将该头文件includ进来后编译仍然提示函数未定义一般是由于该函数要求在较高windows版本上才能运行,解决方法是修改 WINVER 宏的定义
    在引用该头文件前加上
    #define WINVER 0x501 ============================================
    Minimum system required Macros to define 
    Windows Vista _WIN32_WINNT>=0x0600 
    WINVER>=0x0600  
    Windows Server 2003 _WIN32_WINNT>=0x0502 
    WINVER>=0x0502  
    Windows XP _WIN32_WINNT>=0x0501 
    WINVER>=0x0501  
    Windows 2000 _WIN32_WINNT>=0x0500 
    WINVER>=0x0500  
    Windows NT 4.0 _WIN32_WINNT>=0x0400 
    WINVER>=0x0400  
    Windows Me _WIN32_WINDOWS=0x0500 
    WINVER>=0x0500  
    Windows 98 _WIN32_WINDOWS>=0x0410 
    WINVER>=0x0410  
    Windows 95 _WIN32_WINDOWS>=0x0400 
    WINVER>=0x0400  
      

  20.   

    Fatal Error C1010 
    unexpected end of file while looking for precompiled header directive 那是MS SDK的Bug,MS几年如一日,从没改过,调整你的include顺序。
    在CPP文件第一行加上#include "stdafx.h"。 
    或者Rebuild All. 
     告诫大家一下edit box单’\n’不能回车 "\r\n"才行
    在资源编辑时,点中对话框模板然后按CTRL+D,接着按你的要求用鼠标逐个控件单击,在控件旁边会出现一个蓝底的数码,这个数码就表示它在本对话框中的TAB序列号,点错可以重新点一次,很方便的。除CTRL+D外,点中对话框模板后菜单条上会出现一个layout菜单,这个菜单就有一个子菜单叫Tab   Order,点击之即可。  格式化一段乱七八糟的源代码 
        选中那段源代码,按ATL+F8。  
    [注:选中一段代码,按下Tab,或shift+Tab,右(或左)移一个TAb]  
      

  21.   

    我来提个问题吧有一个CMainDlg作为主窗口,里边利用函数
    Create(IDD_SUB_DLG, this);
    弹出一个无模式对话框 CSubDlg,并作为了CMainDlg的子窗口。如果不许在CSubDlg内声明Class CMainDlg
    也不可以引入 CMainDlg的头文件
    也不可以把CSubDlg 声明为 CMainDlg 的友元类
    在CSubDlg如何对CMainDlg 的公有成员或 函数进行操作呢?本人觉得这是保存CSubDlg独立性和封装完整性的一种不错的技巧
      

  22.   

    在创建MFC项目时,   不使用MFC   AppWizard向导,   如果没有设置好项目参数,   就会在编译时产生很多连接错误,   如error   LNK2001错误,   典型的错误提示有:  
      libcmtd.lib(crt0.obj)   :   error   LNK2001:   unresolved   external   symbol   _main  
      LIBCD.lib(wincrt0.obj)   :   error   LNK2001:   unresolved   external   symbol   _WinMain@16  
      msvcrtd.lib(crtexew.obj)   :   error   LNK2001:   unresolved   external   symbol   _WinMain@16  
      nafxcwd.lib(thrdcore.obj)   :   error   LNK2001:   unresolved   external   symbol   __beginthreadex  
      nafxcwd.lib(thrdcore.obj)   :   error   LNK2001:   unresolved   external   symbol   __endthreadex  

      下面介绍解决的方法:  
      1.   Windows子系统设置错误,   提示:  
      libcmtd.lib(crt0.obj)   :   error   LNK2001:   unresolved   external   symbol   _main  
      Windows项目要使用Windows子系统,   而不是Console,   可以这样设置:  
      [Project]   -->   [Settings]   -->   选择"Link"属性页,  
      在Project   Options中将/subsystem:console改成/subsystem:windows    
      2.   Console子系统设置错误,   提示:  
      LIBCD.lib(wincrt0.obj)   :   error   LNK2001:   unresolved   external   symbol   _WinMain@16  
      控制台项目要使用Console子系统,   而不是Windows,   设置:  
      [Project]   -->   [Settings]   -->   选择"Link"属性页,  
      在Project   Options中将/subsystem:windows改成/subsystem:console  
      3.   程序入口设置错误,   提示:  
      msvcrtd.lib(crtexew.obj)   :   error   LNK2001:   unresolved   external   symbol   _WinMain@16  
      通常,   MFC项目的程序入口函数是WinMain,   如果编译项目的Unicode版本,   程序入口必须改为wWinMainCRTStartup,   所以需要重新设置程序入口:  
      [Project]   -->   [Settings]   -->   选择"C/C++"属性页,  
      在Category中选择Output,  
      再在Entry-point   symbol中填入wWinMainCRTStartup,   即可  
      4.   线程运行时库设置错误,   提示:  
      nafxcwd.lib(thrdcore.obj)   :   error   LNK2001:   unresolved   external   symbol   __beginthreadex  
      nafxcwd.lib(thrdcore.obj)   :   error   LNK2001:   unresolved   external   symbol   __endthreadex  
      这是因为MFC要使用多线程时库,   需要更改设置:  
      [Project]   -->   [Settings]   -->   选择"C/C++"属性页,  
      在Category中选择Code   Generation,  
      再在Use   run-time   library中选择Debug   Multithreaded或者multithreaded  
      其中,  
      Single-Threaded                                 单线程静态链接库(release版本)  
      Multithreaded                                     多线程静态链接库(release版本)  
      multithreaded   DLL                             多线程动态链接库(release版本)  
      Debug   Single-Threaded                     单线程静态链接库(debug版本)  
      Debug   Multithreaded                         多线程静态链接库(debug版本)  
      Debug   Multithreaded   DLL                 多线程动态链接库(debug版本)  
      单线程:   不需要多线程调用时,   多用在DOS环境下  
      多线程:   可以并发运行  
      静态库:   直接将库与程序Link,   可以脱离MFC库运行  
      动态库:   需要相应的DLL动态库,   程序才能运行  
      release版本:   正式发布时使用  
      debug版本:   调试阶段使用  
      

  23.   

    1. 窗口最大化、最小化的实现 
    当我们不能用标题栏的最大化、最小化及恢复按钮而又需在其他的地方实现这些功能,可以在指定的消息处理函数里添加:WINDOWPLACEMENT wndpl;WINDOWPLACEMENT *pwndpl;pwndpl = &wndpl;GetWindowPlacement(pwndpl);pwndpl->showCmd = SW_SHOWMINMIZED; //实现窗口最小化SetWindowPlacement(pwndpl);其中GetWindowPlacement()函数获取当前窗口布局的结构WINDOWPLACEMENT的结构变量指针,结构WINDOWPLACEMENT定义为:typedef struct tagWINDOWPLACEMENT{    UINT length;    UINT flags;    UINT showCmd;    POINT ptMinPosition;    POINT ptMaxPosition;    RECT rcNormalPosition;}WINDOWPLACEMENT;其中的成员变量showCmd确定当前窗口的状态,取值一般为:·SW_HIDE:隐藏窗口·SW_MINIMIZE:最小化指定的窗口·SW_RESTORE:恢复原来的大小·SW_SHOW:以原来的大小激活并显示·SW_SHOWMAXIMIZED:激活并最大化窗口SetWindowPlacement()函数就是按WINDOWPLACEMENT的设置来显示窗口2. 为什么要使用GetSafeHwnd()函数
    当我们想得到一个窗口对象(CWnd的派生对象)指针的句柄(HWND)时,最安全的方法是使用GetSafeHwnd()函数,通过下面的例子来看其理由:CWnd *pwnd = FindWindow(“ExploreWClass”,NULL); //希望找到资源管理器HWND hwnd = pwnd->m_hwnd; //得到它的HWND这样的代码当开始得到的pwnd为空的时候就会出现一个“General protection error”,并关闭应用程序,因为一般不能对一个NULL指针访问其成员,如果用下面的代码:CWnd *pwnd = FindWindow(“ExploreWClass”,NULL); //希望找到资源管理器HWND hwnd = pwnd->GetSafeHwnd(); //得到它的HWND就不会出现问题,因为尽管当pwnd是NULL时,GetSafeHwnd仍然可以用,只是返回NULL,通过GetSafeHwnd()的实现代码就更清楚了:_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const{   return this == NULL?NULL:m_hWnd;}3. 如何使程序处于极小状态
    如果我们不想让程序的窗口被别人看见,就可以让它保持在极小状态:在恢复程序窗口的时候,Window会发送WM_QUERYOPEN消息,只要在其消息处理函数里返回false就可以了。BOOL CmainFrame::OnQueryOpen(){return false;}4. 如何禁止和能用关闭按钮
    Cmenu *pmenu = AfxGetMainWnd()->GetSystemMenu(FALSE);if(pmenu){pmenu->EnableMenuItem(SC_CLOSE,MF_BYCOMMAND|MF_GRAYED);}恢复时只需将MF_GRAYED改为MF_ENABLED5. 如何在程序中延时
    方法一:
    使用sleep函数,如延时2秒,用sleep(2000);方法二:
    使用sleep函数的不利在于延时期间不能处理其他的消息,如果时间太长,就好象死机一样,利用ColeDateTime类和ColeDateTimeSpan类实现延时就不会出现那样的问题:ColeDateTime start_time = ColeDateTime::GetCurrentTime();ColeDateTimeSpan end_time = ColeDateTime::GetCurrentTime()-start_time;While(end_time.GetTotalSeconds() <= 2){MSG msg;GetMessage(&msg,NULL,0,0);PreTranslateMessage(&msg);End_time = ColeDateTime::GetCurrentTime-start_time;}这样在延时的时候我们也能够处理其他的消息。
    看了论坛里的一些总结文章很好,我把里面没有怎么看到的也写了一点点出来,不知道有没有重复,希望能有些微的作用.本文引用通告地址: http://blog.csdn.net/laiyiling/services/trackbacks/22293.aspx 6. 如何创建可伸缩的对话框
    在进行对话框的设计时,有时候我们需要设计可伸缩的对话框,当用户按下某个按钮时弹出或隐藏对话框的下半部分。(1)、首先在对话框中建立一个图片控件把ID设为IDC_DIVIDER,Type设置为矩形,Color设置为黑色,并将其设定为一线状,拖放在适当的位置做为伸缩对话框的分割线,属性设为不可见。(2)、实现的原理:先获取对话框的尺寸大小,然后根据的位置来确定缩减后的对话框大小,其实对话框伸缩的变化就是的值,在缩减对话框后,我们要使不可见的部分控件被禁止,以禁止加速键和TAB键对其的操作,在扩展对话框后,原来被禁止的控件又要使能。先在对话框上的伸缩按钮添加单击消息处理函数:void C***Dlg::OnButtonExpand(){static int bexpand = FALSE; //设初始时为已扩展的ExpandDialog(IDC_DIVIDER,bexpand);//调用扩展或缩减处理函数Bexpand = !bexpand;//状态取反,为下次的单击处理准备}//在对话框中添加一个成员函数ExpandDialog,用于扩展或缩减void C***Dlg::ExpandDialog(int nResourceID,BOOL bexpand){//参数nResourceID表示分割线的ID//参数bexpand为TRUE时表示要扩展对话框,否则缩减对话框static CRect rcLarge;static CRect rcSmall;if(rcLarge.IsRectNULL()) //首次使用时记下对话框的最大、最小尺寸{   CRect rcLand;   CWnd *pwndLand = GetDlgItem(nResourceID);   ASSERT(pwndLand);   GetWindowRect(rcLarge);   pwndLand->GetWindowRect(rcLand);   rcSmall = rcLarge;   rcSmall.bottom = rcLand.bottom;}if(bexpand){   SetWindowPos(NULL,0,0,rcLarge.Width(),rcLarge.Height(),SWP_NOMOVE|SWP_NOZORDER);EnableVisible();}else{   SetWindowPos(NULL,0,0,rcSmall.Width(),rcSmall.Height(),SWP_NOMOVE|SWP_NOZORDER);EnableVisible();}}//在对话框中添加一个成员函数EnableVisible,用于能用和禁止部分控件void C***Dlg:: EnableVisible(){CWnd *pwnd = GetDlgItem(GW_CHILD);CRect retest;CRect rcControl;CRect rcShow;GetWindowRect(rcShow);While(pwnd != NULL){pwnd->GetWindowRect(rcControl);if(rcTest.IntersectRect(rcShow,rcControl))   pwnd->EnableWindow(TRUE);else   pwnd->EnableWindow(FALSE);pwnd = pwnd->GetWindow(GW_HWNDNEXT);   }}7. 为什么有RichEdit控件的对话框无法显示如果在对话框上放一个RichEdit控件,往往发现对话框却无法正常显示,这是因为应用程序还没有为RichEdit控件的编辑功能做好准备,解决办法就是在应用程序的InitInstance()函数调用AfxInitRichEdit()函数初始化RichEdit控件
      

  24.   

    最好能整理一下,做成pdf或者chm格式的。
      

  25.   

    一、打开CD-ROM
    mciSendString("Set cdAudio door open wait",NULL,0,NULL);
    二、关闭CD_ROM
    mciSendString("Set cdAudio door closed wait",NULL,0,NULL);
    三、关闭计算机
    OSVERSIONINFO OsVersionInfo; //包含操作系统版本信息的数据结构
    OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    GetVersionEx(&OsVersionInfo); //获取操作系统版本信息
    if(OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_Windows)
    {
    //Windows98,调用ExitWindowsEx()函数重新启动计算机
    DWORD dwReserved;
    ExitWindowsEx(EWX_REBOOT,dwReserved); //可以改变第一个参数,实现注销用户、
    //关机、关闭电源等操作// 退出前的一些处理程序
    }
    四、重启计算机
    typedef int (CALLBACK *SHUTDOWNDLG)(int); //显示关机对话框函数的指针
    HINSTANCE hInst = LoadLibrary("shell32.dll"); //装入shell32.dll
    SHUTDOWNDLG ShutDownDialog; //指向shell32.dll库中显示关机对话框函数的指针
    if(hInst != NULL)
    {
    //获得函数的地址并调用之
    ShutDownDialog = (SHUTDOWNDLG)GetProcAddress(hInst,(LPSTR)60);
    (*ShutDownDialog)(0);
    }
    五、枚举所有字体
    LOGFONT lf;
    lf.lfCharSet = DEFAULT_CHARSET; // Initialize the LOGFONT structure
    strcpy(lf.lfFaceName,"");
    CClientDC dc (this);//Enumerate the font families
    ::EnumFontFamiliesEx((HDC) dc,&lf,
    (FONTENUMPROC) EnumFontFamProc,(LPARAM) this,0);//枚举函数
    int CALLBACK EnumFontFamProc(LPENUMLOGFONT lpelf,LPNEWTEXTMETRIC lpntm,DWORD nFontType,long lparam)
    {
    // Create a pointer to the dialog window
    CDay7Dlg* pWnd = (CDay7Dlg*) lparam;
    // add the font name to the list boxpWnd ->m_ctlFontList.AddString(lpelf ->elfLogFont.lfFaceName);// Return 1 to continue font enumeration
    return 1;
    }
    其中m_ctlFontList是一个列表控件变量
    六、一次只运行一个程序实例,如果已运行则退出
    if( FindWindow(NULL,"程序标题")) exit(0);
    七、得到当前鼠标所在位置
    CPoint pt;
    GetCursorPos(&pt); //得到位置
    八、上下文菜单事件触发事件:
    OnContextMenu事件
    九、显示和隐藏程序菜单
    CWnd *pWnd=AfxGetMainWnd();
    if(b_m) //隐藏菜单
    {
    pWnd->SetMenu(NULL);
    pWnd->DrawMenuBar();
    b_m=false;
    }
    else
    {
    CMenu menu;
    menu.LoadMenu(IDR_MAINFRAME); ////显示菜单 也可改变菜单项
    pWnd->SetMenu(&menu);
    pWnd->DrawMenuBar();
    b_m=true;
    menu.Detach();
    }
      

  26.   

    十、获取可执行文件的图标
    HICON hIcon=::ExtractIcon(AfxGetInstanceHandle(),_T("NotePad.exe"),0);
    if (hIcon &&hIcon!=(HICON)-1)
    {
    pDC->DrawIcon(10,10,hIcon);
    }
    DestroyIcon(hIcon);
    十一、窗口自动靠边程序演示
    BOOL AdjustPos(CRect* lpRect)
    {
    //自动靠边
    int iSX=GetSystemMetrics(SM_CXFULLSCREEN);
    int iSY=GetSystemMetrics(SM_CYFULLSCREEN);RECT rWorkArea;
    BOOL bResult = SystemParametersInfo(SPI_GETWORKAREA, sizeof(RECT), &rWorkArea, 0);CRect rcWA;
    if(!bResult)
    {
    //如果调用不成功就利用GetSystemMetrics获取屏幕面积
    rcWA=CRect(0,0,iSX,iSY);
    }
    else
    rcWA=rWorkArea;int iX=lpRect->left;
    int iY=lpRect->top;
    if(iX < rcWA.left + DETASTEP && iX!=rcWA.left)
    {
    //调整左
    //pWnd->SetWindowPos(NULL,rcWA.left,iY,0,0,SWP_NOSIZE);
    lpRect->OffsetRect(rcWA.left-iX,0);
    AdjustPos(lpRect);
    return TRUE;
    }
    if(iY < rcWA.top + DETASTEP && iY!=rcWA.top)
    {
    //调整上
    //pWnd->SetWindowPos(NULL ,iX,rcWA.top,0,0,SWP_NOSIZE);
    lpRect->OffsetRect(0,rcWA.top-iY);
    AdjustPos(lpRect);
    return TRUE;
    }
    if(iX + lpRect->Width() > rcWA.right - DETASTEP && iX !=rcWA.right-lpRect->Width())
    {
    //调整右
    //pWnd->SetWindowPos(NULL ,rcWA.right-rcW.Width(),iY,0,0,SWP_NOSIZE);
    lpRect->OffsetRect(rcWA.right-lpRect->right,0);
    AdjustPos(lpRect);
    return TRUE;
    }
    if(iY + lpRect->Height() > rcWA.bottom - DETASTEP && iY !=rcWA.bottom-lpRect->Height())
    {
    //调整下
    //pWnd->SetWindowPos(NULL ,iX,rcWA.bottom-rcW.Height(),0,0,SWP_NOSIZE);
    lpRect->OffsetRect(0,rcWA.bottom-lpRect->bottom);
    return TRUE;
    }
    return FALSE;
    }
    //然后在ONMOVEING事件中使用所下过程调用
    CRect r=*pRect;
    AdjustPos(&r);
    *pRect=(RECT)r;
    十二、给系统菜单添加一个菜单项
    给系统菜单添加一个菜单项需要进行下述三个步骤:
    首先,使用Resource Symbols对话(在View菜单中选择Resource Symbols...可以显示该对话)定义菜单项ID,该ID应大于0x0F而小于0xF000;
    其次,调用CWnd::GetSystemMenu获取系统菜单的指针并调用CWnd:: Appendmenu将菜单项添加到菜单中。下例给系统菜单添加两个新的菜单项。
    int CMainFrame:: OnCreate (LPCREATESTRUCT lpCreateStruct)
    {

    //Make sure system menu item is in the right range.
    ASSERT(IDM_MYSYSITEM<0xF000);
    //Get pointer to system menu.
    CMenu* pSysMenu=GetSystemMenu(FALSE);
    ASSERT_VALID(pSysMenu);
    //Add a separator and our menu item to system menu.
    CString StrMenuItem(_T ("New menu item"));
    pSysMenu->AppendMenu(MF_SEPARATOR);
    pSysMenu->AppendMenu(MF_STRING, IDM_MYSYSITEM, StrMenuItem);

    }十三、运行其它程序
    //1、运行EMAIL或网址
    char szMailAddress[80];
    strcpy(szMailAddress,"mailto:[email protected]");
    ShellExecute(NULL, "open", szMailAddress, NULL, NULL, SW_SHOWNORMAL);//2、运行可执行程序
    WinExec("notepad.exe",SW_SHOW); //运行计事本
    十四、动态增加或删除菜单
    1、 增加菜单
    //添加
    CMenu *mainmenu;
    mainmenu=AfxGetMainWnd()->GetMenu(); //得到主菜单
    (mainmenu->GetSubMenu (0))->AppendMenu (MF_SEPARATOR);//添加分隔符
    (mainmenu->GetSubMenu (0))->AppendMenu(MF_STRING,ID_APP_ABOUT,_T("Always on &Top")); //添加新的菜单项
    DrawMenuBar(); //重画菜单2、 删除菜单
    //删除
    CMenu *mainmenu;
    mainmenu=AfxGetMainWnd()->GetMenu(); //得到主菜单
    CString str ;
    for(int i=(mainmenu->GetSubMenu (0))->GetMenuItemCount()-1;i>=0;i--) //取得菜单的项数。
    {
    (mainmenu->GetSubMenu (0))->GetMenuString(i,str,MF_BYPOSITION);
    //将指定菜单项的标签拷贝到指定的缓冲区。MF_BYPOSITION的解释见上。
    if(str=="Always on &Top") //如果是刚才我们增加的菜单项,则删除。
    {
    (mainmenu->GetSubMenu (0))->DeleteMenu(i,MF_BYPOSITION);
    break;
    }
    }
    十五、改变应用程序的图标

    十六、另一种改变窗口标题的方法
    使用语句 CWnd* m_pCWnd = AfxGetMainWnd( ),然后,再以如下形式调用SetWindowText()函数:
    SetWindowText( *m_pCWnd,(LPCTSTR)m_WindowText);// m_WindowText可以是一个CString类的变量。
    十七、剪切板上通过增强元文件拷贝图像数据
    下面代码拷贝通过元文件拷贝图像数据到任何应用程序,其可以放置在CView派生类的函数中。
    CMetaFileDC * m_pMetaDC = new CMetaFileDC();
    m_pMetaDC->CreateEnhanced(GetDC(),NULL,NULL,"whatever");
    //draw meta file
    //do what ever you want to do: bitmaps, lines, text...
    //close meta file dc and prepare for cliPBoard;
    HENHMETAFILE hMF = m_pMetaDC->CloseEnhanced();//copy to clipboard
    OpenClipboard();
    EmptyClipboard();
    ::SetClipboardData(CF_ENHMETAFILE,hMF);
    CloseClipboard();
    //DeleteMetaFile(hMF);
    delete m_pMetaDC;
    十八、剪切板上文本数据的传送
    把文本放置到剪接板上:
    CString source;
    //put your text in source
    if(OpenClipboard())
    {
    HGLOBAL clipbuffer;
    char * buffer;
    EmptyClipboard();
    clipbuffer = GlobalAlloc(GMEM_DDESHARE, source.GetLength()+1);
    buffer = (char*)GlobalLock(clipbuffer);
    strcpy(buffer, LPCSTR(source));
    GlobalUnlock(clipbuffer);
    SetClipboardData(CF_TEXT,clipbuffer);
    CloseClipboard();
    }从剪接板上获取文本:
    char * buffer;
    if(OpenClipboard())
    {
    buffer = (char*)GetClipboardData(CF_TEXT);
    //do something with buffer here
    //before it goes out of scope
    }
    CloseClipboard();
    十九、将捕捉屏幕图像到剪切版中
    void CShowBmpInDlgDlg::OnCutScreen()
    {
    ShowWindow(SW_HIDE);
    RECT r_bmp={0,0,::GetSystemMetrics(SM_CXSCREEN),
    ::GetSystemMetrics(SM_CYSCREEN)};
    HBITMAP hBitmap = CopyScreenToBitmap(&r_bmp);//hWnd为程序窗口句柄
    if (OpenClipboard())
    {
    EmptyClipboard();
    SetClipboardData(CF_BITMAP, hBitmap);
    CloseClipboard();
    }
    ShowWindow(SW_SHOW);
    }HBITMAP CShowBmpInDlgDlg::CopyScreenToBitmap(LPRECT lpRect)//lpRect 代表选定区域
    {
    HDC hScrDC, hMemDC; // 屏幕和内存设备描述表
    HBITMAP hBitmap, hOldBitmap; // 位图句柄
    int nX, nY, nX2, nY2; // 选定区域坐标
    int nWidth, nHeight; // 位图宽度和高度
    int xScrn, yScrn; // 屏幕分辨率if (IsRectEmpty(lpRect)) // 确保选定区域不为空矩形
    return NULL;//为屏幕创建设备描述表
    hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);//为屏幕设备描述表创建兼容的内存设备描述表
    hMemDC = CreateCompatibleDC(hScrDC);// 获得选定区域坐标
    nX = lpRect->left;
    nY = lpRect->top;
    nX2 = lpRect->right;
    nY2 = lpRect->bottom;// 获得屏幕分辨率
    xScrn = GetDeviceCaps(hScrDC, HORZRES);
    yScrn = GetDeviceCaps(hScrDC, VERTRES);//确保选定区域是可见的
    if (nX<0)
    nX = 0;
    if (nY<0)
    nY = 0;
    if (nX2>xScrn)
    nX2 = xScrn;
    if (nY2>yScrn)
    nY2 = yScrn;nWidth = nX2 - nX;
    nHeight = nY2 - nY;// 创建一个与屏幕设备描述表兼容的位图
    hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);// 把新位图选到内存设备描述表中
    hOldBitmap =(HBITMAP)SelectObject(hMemDC, hBitmap);// 把屏幕设备描述表拷贝到内存设备描述表中
    BitBlt(hMemDC, 0, 0, nWidth, nHeight,
    hScrDC, nX, nY, SRCCOPY);//得到屏幕位图的句柄
    hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);//清除
    DeleteDC(hScrDC);
    DeleteDC(hMemDC);// 返回位图句柄
    return hBitmap;
    }
    二十、如何将位图缩放显示在Static控件中
    //在Staic控件内显示位图
    void CShowBmpInDlgDlg::ShowBmpInStaic()
    {
    CBitmap hbmp;
    HBITMAP hbitmap;//将pStatic指向要显示的地方
    CStatic *pStaic=(CStatic*)GetDlgItem(IDC_IMAGE);//装载资源 MM.bmp是我的一个文件名,用你的替换
    hbitmap=(HBITMAP)::LoadImage (::AfxGetInstanceHandle(),"MM.bmp",
    IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
    hbmp.Attach(hbitmap);//获取图片格式
    BITMAP bm;
    hbmp.GetBitmap(&bm);CDC dcMem;
    dcMem.CreateCompatibleDC(GetDC());
    CBitmap *poldBitmap=(CBitmap*)dcMem.SelectObject(hbmp);CRect lRect;
    pStaic->GetClientRect(&lRect);
    lRect.NormalizeRect();//显示位图
    pStaic->GetDC()->StretchBlt(lRect.left ,lRect.top ,lRect.Width(),lRect.Height(),
    &dcMem,0 ,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
    dcMem.SelectObject(&poldBitmap);
    }