• VC++大杂烩


    1.        如何获取系统日期

    CTime tm = CTime :: GetCurrentTime();

    CString strTime = tm.Format(_TEXT(“%Y-%M-%d %H:%M:%S));

    MessageBox(strTime);

     

    2.        动态分配二维数组

    int **array;

    array = new int*[col];

    if(array = = 0) exit(-1);

    for(int i=0; i<col; i++){

    array[i] = new int[row];

    if(array[i] = = 0)

        exit(-1); }

    //释放

    for(i=0; i<col; i++){

      delete [] array[i]; }

    delete [] array;

     

    3.        如何定义一个二维字符串数组

          char  **str = “abcdef” ; //一维

          char  *str[row][col]={“abc”, “cdf”, “efg”…..}; //row×col

     

    4.        将一个十六进制”FF””FA”等字符串数组等转化为十进制数组

    int array[32][32];

    int a,b, n=0;

    int result1;

    char *str;

    for(int i=0; i<32; i++)

    for(int j=0; j<32; j++){

         str = str[i][j];

         if(str[0] >= ‘A’ && str[1] >=’A’){  //”AF”

            a = str[0] – ‘A’;

            b= str[1] – ‘A’;

            result1 = (a+10)*16+(b+10)*1;}

         else if(str[0] >= ‘A’ && str[1] <’A’){ //”A9”

            a = str[0] – ‘A’;

            b = ‘A’  – str[1] +1;

            result1 = (a+10)*16+b;}

         else if(str[0] < ‘A’ && str[1] >=’A’){ //”8B”

            a = ‘A’ – str[0]+1;

            b = str[1] – ‘A’;

            result1 = a*16+(b+10)*1;}

         else{                       //”87”

            a = ‘A’ – str[0]+1;

            b = ‘A’  – str[1] +1;

            result1 = a*16+b;}

         array[i][j] = reslut1;

         printf(“%5d”, array[i][j]);

         n++;

         if(n%32 = = 0)  printf(“\n”); }

    将这个矩阵数组在屏幕上显示:

    #i nclude < afxwin.h >

    #i nclude < afxext.h >

    #i nclude < afxdisp.h >

    #i nclude < afxdtctl.h >

    DWORD color_;

    HDC hMyDC = GetDC(NULL);

    for(i=0; i<32; i++)

    for(j=0; j<32; j++){

         color_ = array[i][j];

         color_ = color_*256*256 + color_*256+color_;

         SetPixel(hMyDC, j, i, color_); }

     

    5.        将一个整型转化为一个字符串 _itoa

    //将从位图信息头得到的图像宽度和高度显示出来

    char  buffer1[20], buffer2[20];

    _itoa( width, buffer1, 10);

    _itoa( height, buffer2, 10);

    char str[80];

    strcpy(str, “width=”);

    strcat(str, buffer1);

    strcat(str, “, hight=”;

    strcat(str, buffer2);

    AfxMesageBox(str, MB_OK, 0);

     

    6.        当把二维数组地址用作参数传递,而又要此地址不断递增时,可以另外定义一个同类型指针,指向二维数组第一个元素的地址,把这个赋值放在循环外:

         unsigned char *p;

         p = &m_pImage[0][0];

       然后在循环中,可以p + m_count*4096;

     

    7.        改变最近打开文档的个数

    InitInstance()中的LoadStdProfileSetting(8); //括号里是要设置的个数

    8.        打开调色板对话框

    CColorDialog  dlg;

    dlg.Domodal();

     

    9.        如何添加工具栏,如何使用Slider?

    OnInitDialog()中添加:

    CSliderCtrl *pSliderCtrl=(CSliderCtrl*)GetDlgItem(IDC_SLIDER1);

    pSliderCtrl -> SetRange(0,255,TRUE); //设置滑动条的范围

    pSliderCtrl -> SetPos(100); // 设置滑动条的初始位置

    Dlg类中响应WM_HSCROLL消息:

    CSliderCtrl *pSliderCtrl=(CSliderCtrl*)GetDlgItem(IDC_SLIDER1);

    m_nCur = pSliderCtrl - >GetPos(); //获得当前的位置值

     

    10.     更改光标

    :: SetCursor(:: LoadCursor(NULL, IDC_SIZEALL));

    //如果是自己定义的光标资源,则要用MAKEINTRESOURCE 进行转化,例如:

    :: SetCursor(:: LoadCursor(NULL, IDC_CURSOR_CUT));

     

    11.     设置文本显示的一些函数

    CDC  dc(this); 

    CPen  pen(PS_SOLID, 2, RGB(0,0,255));  //初始化一支笔

    CBrush  *pBush = CBrush :: FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));

    dc.SelectObject(pBrush);

    dc.SetTextColor(RGB(255,0 ,255));

    dc.SetBKMode(TRANSPARENT); //将文本背景设置为透明

     

    12.     将对话框中的图像拷贝到剪贴板

    CWnd* pWnd = GetDlgItem(IDC_IMAGE_SELECT);

    WINDOWPLACEMENT *winPlacement;

    WinPlacement = new WINDOWPLACEMENT;

    pWnd -> GetWindowPlacement(winPlacement); //获得一个控件的位置

    CDC *dcTemp;

    dcTemp= new CClientDC(FromHandle(m_hWnd));

    CDC  memDC;

    memDC.CreateCompatibleDC(dcTemp); //创建一个兼容的DC

    CBitmap  bm;

    CSize  sz(lWidth, lHeight);

    bm.CreateCompatilbleBitmap(dcTemp, sz.cx, sz.cy); //创建一个兼容的位图

    CBitmap* oldbm = memDC.SelectObject(&bm);

    memDC.BitBlt(0, 0, sz.cx, sz.cy, dcTemp, winPlacement ->rcNormalPosition.left,

                winPlacement ->rcNormalPosition.top, SRCCOPY);

    pWnd -> OpenClipboard();  //打开剪贴板,不用pWnd->GetParent()->OpenClipard();

    :: EmptyClipard();

    :: SetClipardData(CF_BITMAP, bm.m_hObject); //粘贴到剪贴板

    CloseClipard();

    memDC.SelcetObject(oldbm);

    delete dcTemp;

     

    13.     VC里获取一个文件夹路径

    BROWSEINFO  bi;

    TCHAR  szDisplayName[MAX_PATH];

    LPITEMIDLIST  pidl;

    LPMALLOC  pMalloc = NULL;

    ZeroMemory(&bi, sizeof(bi));

    bi.hWndOwner = GetSafeHwnd();

    bih.pszDisplayName = szDisplayName;

    bi.lpszTitle = TEXT(“Please select a folder:”);

    bi.ulFlags = BIF_RETURNONLYFSDIRS;

    Pidl = SHBrowseForFolder(&bi);

    if(pidl) {

          SHGetPathFromIDList(pidl, szDisplayName);

          sPath = szDisplayName;

          MessageBox(sPath); }

     

    14.     如何设置密码输入时显示的是*

    #i nclude <iostream.h>

    #i nclude <conio.h>

    char a[8];

    void main() {

    int i=0;

    Cout<<”请输入密码:”<<endl;

    while(1) {

         a[i] = getch();

         if( i>=8 || a[i]= = 13)

            break;

         putch(‘*’);

         i++; }

    cout<<endl<<a<<endl;

    getch(); }

     

    15.     设置菜单:可以使用CMenu:: EnableMenuItem()来设置菜单可用或禁用,但是在MFC中,要使该函数起作用,需要将CWnd :: m_bAutomenuEnable设置为FALSE.

    16.     关闭子窗口

    :: SendMessage(:: AfxGetMainWnd() -> m_hWnd, WM_COMMAND, ID_FILE_CLOSE,0);

    获取主窗口的指针  CWinThread :: m_pMainWnd

    调用AfxGetMainWnd()可实现

       继续上面的总结~! To making  it  count~!。。。。。。

     
    1.        获取CMain类的指针

    CMain* pApp = ((CMain*)AfxGetApp()->m_pMainWnd);

    ASSERT_KINDOF(CMain, pAPP); //确保pAPPCMain的类对象

    2.        VC++如何获取应用程序的实例句柄

    实例句柄保存在CWinApp  m_hInstance

    HANDLE  hInstance = AfxGetInstanceHandle();

    3.        VC++怎样加载其他的应用程序 三个SDK函数WinExec, ShellExecute, CreateProcess.

          WinExec最简单,前一个指定路径,后一个指定显示方式;

          ShellExecute(null, null, _T(“1.txt”), NULL, _T(“c:\\temp”), SW_SHOWNORMAL);

          STARTUPINFO  stinfo; //启动窗口的信息

    PROCESSINFO  proinfo; //进程的信息

    CreateProcess(NULL,_T(“notepad.exe)”,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&stinfo,&proinfo);

     

    4.        如何确定顶层菜单所占据的菜单行数:首先,计算主窗口的高度和客户区高度;其次,从主框窗口的高度中减去客户区、框边界以及标题的高度;最后,除以菜单栏的高度

    CRect rc, rcClient;

    GetWindowRect(rc);

    GetClientRect(rcClient);

    Int menuHeight;

    menuHeight = (rc.Height() – rcClicent.Height()–

    ::GetSystemMetrics(SM_CYCAPTION) – :: GetSystemMetrics(SM_CY)*2))

    -                                                                                                  / :: GetSystemMetrics(SM_CYMENU) ;

    5.        响应下拉菜单的消息为

    ON_CBN_SELECTDOK(ID_TOOL_ZOOM, OnSelectZoomed)

    6.        设置工具栏的标题

    m_wndTestBar.SetWindowText(“your toolbar title”);

     

    7.        如何获得应用程序主窗口的指针

    CWnd  pMainWnd = AfxGetApp() ->m_pMainWnd;

    CMain *pMain = ((CMain*)pMainWnd;

    CRect rect;

    CWnd* pParent = AfxGetApp()->GetMainWnd();

    pParent ->GetWindowRect(&rect); //得到应用程序窗口矩形

    //移到窗口

    pParent -> MoveWindow(rect.left, rect.top, rect.Width()+1,rect.Height()+1,TRUE);

    8.        获得获得子窗口

    CMDIChildWnd* pChild = (CMDIChildWnd*)GetActive();

    //或:CMDIChildWnd* pChild=MDIGetActive();

    9.        获得活动子窗口的活动视图

    CMyView* pView = (CMyView*)pChild->GetActiveView();

    获取当前窗口的指针

    CWnd :: GetForegoundWindow();

    10.     从句柄转换到指针

    HWND hwnd;

    hwnd = :: FindWindow(NULL, “TEST”);

    CWnd* pWnd = FromHandle(hwnd);

    11.     怎样改变进度条控件的颜色,发送消息

    m_progress.SendMessage(PBM_SETBKCOLOR, 0, RGB(255,0,0)); //背景色

    m_progress.SendMessage(PBM_SETBARCOLOR, 0, RGB(0,255,0)); //前景色

    12.     定义char num[10];

            sprintf(num, “%d”, calnum); //格式化数字

            char  unit[]=”矩形”;

            sprintf(num, “%s”, unit);  //格式化字符串

    13.     改变字符串的显示字体和大小

    CFont font;

    font.CreatePointFont(300, “华文行楷”,NULL);

    CFont *pOldFont=dc.SelectObject(&font);

    dc.SelectObject(pOldFont);

     

    14.     将路径中的单’\’变为’\\’

    CMyDoc *pDoc=GetDocument();

    CString reportPath = pDoc -> strPathName;

    int lentemp = reportPath.GetLength();

    reportPath = reportPath.Left(lentemp-4);

    int lenpath = reportPath.GetLength();

    for(int i=0; i<lenpath-1; ) {

         if(reportpath.GetAt(i) = = ‘\\’) {

             reportpath.Insert(i, ‘\\’);

             i+=2; }

         i++; }

     

    15.     获取屏幕分辨率

    HDC  hSrcDC;

    hSrcDC = ::GetDC(AfxGetApp() -> m_pMainWnd->GetSafeHwnd());

    int xSrc, ySrc;

    xSrc = GetDeviceCaps(hSrcDC, HORIRES); //水平分辨率

    ySrc = GetDeviceCaps(hSrcDC, VERTRES); //垂直分辨率

     

    16.     Edit控件响应回车键:利用获取消息来完成,调用虚函数

    PreTranslateMessage(MSG* pMsg) {

       If( pMsg ->message = = WM_KEYDOWN) {

          switch(pMsg -> wParam) {

             case  VK_RETURN:

                GetDlgItem(IDC_BTN_INPUT)->SendMessage(BM_CLICK, 0, 0);

                return TRUE; }  }    }

    17.     改变对话框的背景色:在InitInstance()中加入

    SetDialogBKColor(RGB(160, 180, 220), RGB(255, 0, 0)); //后面是字体颜色

    18.     让指定的矩形框重画 InvalidateRect(&rect, TRUE);

    19.     怎样选择所选的List当前位置

    int  iTem;

    POSITION  pos=m_findCtrl.GetFirstSelectedItemPosition();

    if(pos = = 0) {

      MessageBox(“请选择需要删除的记录”);

      return;  }

    else {

    iTem = m_findCtrl.GetNextSelectedItem(pos); }

      //删除List中的某行

      m_findCtrl.DeleteItem(iTem);

    m_findCtrl.Update(iTem);

     

    20.     动态创建控件

    CEdit  m_edit;

    CRect  rect(0,0,100,200);

    M_edit.Create(WS_CHILD | ES_AUTOHCROLL | WS_BORDER, rect, this, ID_EDIT_1);

    21.     列表控件的应用

    CListCtrl*  m_list;

    CRect  rect_list;

    this->GetCientRect(&rect_list);

    rect_list.top + =100;

    m_list -> Create(WS_CHILD | LVS_REPORT | WS_BORDER | LVS_SINGLESEL, rect_list, this, ID_TABLIST);

    this ->m_list->ModifyStyle(LVS_EDITABELS,0L); //禁止标题编辑

    m_list->ModifyStyle(0L ,LVS_REPORT); //设置为Report类型

    m_list->ModifyStyle(0L, LVS_SHOWSELALWAYS); //始终高亮显示被选中的表项

    m_list->ModifyStyle(0L,LVS_NOSORTHEADER); //禁止标题编辑

    m_list->SetBkColor(RGB(0,200,200)); //设置背景颜色

    m_list->SetTextBkColor(RGB(0,200,200)); //设置文本背景颜色

    m_list->ModifyStyle(LVS_OWNERDRAWFIXED,0L);

    m_list->SetExtendedStyle(LVS_EX_FULLROWSELET  //整行选中

                         |  LVS_EX_HEADERDARGDROP  //允许整列拖动

                         |  LVS_EX_GRIDLINES   //画出网格线

                         |  LVS_EX_FLATSB);  // 扁平风格的滚动条

    22.     取得当前获得焦点的窗口句柄

    HWND  hwnd = ::GetFocus();

    int  iID = :: GetDlgCtrlID(hwnd); // 根据句柄取得其资源符号

     

    23.     修改控件的字体

    CFont m_font;

    m_font.CreateFont(-12,0,0,0,400,FALSE,FALSE,0,GB2312_SHARSET,OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, VARIABLE_PITCH | FF_, “楷体_GB2312”);

    //为想改变字体的控件改变

    m_editPh.SetFont(&m_font, true);

    1.        如何暂停主线程直到第二个线程的终止?

    void CMyTestDialog ::PeekMessageLoop() {

          MSG  msg;

         while ( PeekMessage(&msg, NULL, NULL, NULL, NULL,NULL, PM_REMOVE)) {

                       TranslateMessage(&msg);

                       DispatchMessage(&msg); }  }

    Void CMyTestDialog :: WaitForThreadToTerminate( HANDLE hThread)  {

              //将指示哪个线程需要等待并作进一步处理

          DWORD  dwRet;

          Do {

               dwRet = :: MsgWaitForMultipleObject(1, &hThread, FALSE, INFINITE, QS_ALLINPUT);

               if(dwRef != WAIT_OBJET_0)  {

                     PeekMessageLoop();   }

             }while ( (dwRet != WAIT_OBJET_0) && (dwRet != WAIT_FAILED));

    //示例代码:假设对话框上有一个按钮,当点击按钮时,开始启动第二个线程,等到第

    //二个线程完成后,我们再继续主线程:

    void CMyTestDialog :: OnButton1()  {

          m_pUpdateThread = AfxBeginThread(UpdateDeviceContent, (LPVOID)this);

          ifm_pUpdateThread  {

                    WaitForThreadToTerminate(m_pUpdateThread->m_hThread); }

          //这里可以加入自己的执行代码

         Do whatever you want after the action is finished.  } 

    2.        改变列表框表头的颜色和字体,发送一个HDM_GETITEM消息

    void CHeaderCtrlEx :: DrawItem(LPDRAWITEMSTRUCT  lpDrawItemStruct) {

         ASSERT(lpDrawItemStruct ->ctlType = =ODT_HEADER);

         HDITEM  hdi;

         TCHAR  lpBuffer[256];

         Hdi.mask = HDI_TEXT;

         Hdi.pszText = lpBuffer;

         Hdi.uhTextMax = 256;

         GetItem(lpDrawItemStruct->itemID,&hdi);

    //画按钮框

    :: DrawControl(lpDrawItemStruct->hdc, &lpDrawItemStruct->rcItem, DFC_BUTTOON, DFCS_BUTTONPUSH);

    COLORREF  crOldColor = :: SetTextColor(lpDrawItemStruct->hdc, RGB(255,255,0));

    :: DrawText(lpDrawItemStruct->hdc, lpBuffer, strlen(lpBuffer), &lpDrawItemStruct->rcItem, DT_SINGLELINE | DT_VCENTER | DT_CENTER);

    :: SetTextColor(lpDrawItemStruct->hdc, crOldColor);  } 

    3.        修改标题栏中“无标题-title

          修改“无标题”部分,重载文档中的虚函数SetTitle,加入:

    CDocument:: SetTitle”your title”;

          修改后半部分:将字符串资源中的IDR_MAIN修改为

    我的程序\n\nChange\n\n\nChangeTitle.Document\nChange Document

    或者:在程序的任何地方调用如下语句:

    (AfxGetMainWnd()) -> SetWindowText(“your title”);

          除去标题中间的”-“,可以通过重载CFramWnd类的OnUpdateTitle函数,这个函数在VC提供的帮助文件中找不到,必须手工添加:

    virtual void OnUpdateTitle(BOOL NaDa);

    void CMain :: OnUpdateTitle(BOOL NaDa) {

    CString  csAppName;

    csAppName.Format(AFX_IDS_APP_TITLE);

    SetWindowText(csAppName); }

    //此时显示的结果只有字符串资源AFX_IDS_APP_TITLE 所定义的字符串

          另一种方法是在CMainPreCreateWindow函数中修改的窗口风格:

    BOOL  CMain :: PreCreateWindow(CREATESTRUCT &cs) {

       cs.style &= ~ (LONG)FWS_ADDTOTITLE;

       return  CWnd :: PreCreateWindow(cs); }

    //使用此方法,窗口的标题只显示IDR_MAIN字符串中第一个\n之前的部分。

    4. const的一些用法

        int  a=0;

        const int* b=&a; [1]   int const *b=&a;[2]   const  int* const b=&a; [3]

        const char *p=”const”; [1]  char const *p=”const”; [2]  char const p=”const”; [4]

        const  char*  const p=”const”; [4]

     

        int a=0;

        const int &b=a; [1]   int const &b=a; [2]   int & const b=a; [3]  const int & const b=a; [4]

          如果const位于星号左侧,则const用来修改指针所指向的变量,即指针指向的为不可变的;

          如果const位于星号右侧,const就是修饰指针本身,即指针本身是不可变的;

          [3]中指针本身是不可变的,而指针所指向的内容是可变的,这种情况下不能对指针本身进行更改操作,如b++是错误的;

          [4]中指针本身和指向的内容均为常量

    5. const作为参数用法

    void fun0( const A *a) 在函数体中,按照const所修饰的部分进行常量化,如形参为const A* a,则不能对传递进来的指针的内容进行改变,保护了原指针所指向的内容;

    void fun1(const  A& a) 形参为const A& a,则不能对传递进来的引用对象进行改变,保护了原对象的属性。[注:参数const通常用于参数为指针或引用的情况]

    const修饰返回值: const A fun2();  const  A*  fun3()

    一般用const修饰返回值为对象本身(非引用和指针)的情况多用于二目操作符重载函数,并产生新的对象的时候。

    [总结]: 一般情况下,函数的返回值为某个对象时,如果将其声明为const时,多用于操作符的重载。通常,不建议用const修饰函数的返回值类型为某个对象或对某个对象引用的情况。

    6. 类成员函数中const的使用:一般放在函数体后void fun() const; 如果一个成员函数不会修改数据成员,那么最好将其声明为const,因为const成员函数中不允许对数据成员进行修改,如果修改,编译器会报错,大大提高了程序的健壮性。

    7. 使用const的一些suggestioins

    要大胆地使用const,这将给你带来无尽的益处,但前提是你必须搞清楚原委;

    在参数中使用const应使用引用或指针,而不是一般的对象实例;

    要避免最一般的赋值操作错误,如将const变量赋值;

    不要轻易地将函数的返回类型定为cosnt

          除了重载操作符外一般不要将返回值类型定为某个对象的const引用 

    8. 让应用程序只运行一个实例: AppInitInstance添加如下代码:

         HANDLE  hSem = CreateSemaphore(NULL, 1, 1, m_pszAppName);

         if(GetLastError() = = ERROR_ALREADY_EXISTS) { //信号量存在,则有一个在运行

             CloseHandle(hSem); //关闭信号量句柄

             // 寻找先前的实例窗口

             HWND hWndPrevious = ::GetWindow(::GetDesktopWindow(), GW_CHILD);

             While(:: IsWindow(hWndPrevious))  { //检查窗口是否有预设的标记

               if(::GetProp(hWndPrevious,m_pszAppName))  { //有,则寻找主窗口

                   if(:: IsIconic(hWndPrevious))  { //窗口最小化,则恢复其大小

                       ::SetForegroundWindow(hWndPrevious); //将主窗口激活

                       ::SetForgoundWindow(::GetLastActivePopup(hWndPrevious));

                       //将主窗口激活

                       ::ShowWindow(hWndPrevious, SW_NORMAL);

                       reurn FALSE;  } //退出本实例

               hWndPrevious = :: GetWindow(hWndPrevious, GW_HWNDNEXT); //继续找 }

         AfxMessageBox(“only one application program can run”);

         return  FALSE; } }

    1.获取本机的IP地址

    #i nclude <stdio.h>

    #i nclude <winsock2.h>

    #pragma  comment (lib, “ws2_32.lib”)

    Void CheckIP() {

       WSADATA  wsadata;

    Char  name[155];

    Char  *ip;

    PHOSTENT  hostinfo;

    If (WSAStartUp( MAKEWORD(2,0), &wsadate) = = 0)  {

         If ( gethostname( name, sizeof(name)) = = 0) {

             If((hostinfo = gethostbyname(name)) != NULL)  {//获得IP的函数

                 Ip = inet_ntoa(*(struct in_addr*)*hostinfo -> h_addr_list);

                 Printf*”%s\n”, ip); } }

    WSACleanup(); }    }

     

    2. CWnd:: SetDlgItemInt();  被对话框设定一个由字符串表示的整型值。

       CSemaphore ---à CSyncObject------àCObject

         在一个进程或多个进程中允许访问一种资源的允许线程数,CSemaphore对象维持当前获取一种指定资源的线程个数。当计数大于0时,Semaphore对象的状态是有信号状态;典型应用是用Semaphore去限制使用一种资源的线程个数。用WaitforSingleObject等待有信号状态,返回时则减少对Semaphore的计数。

    3. 得到计算机所有驱动函数GetAllDriverList()

         CString  tmp = _T(“A:\\”), dir;

         for(int i=1; i<=25; i++) {

              dir = CString(‘A’+i)+ _T(“:\\”);

              if(GetDriveType(dir.GetBuffer(0)) = = DRIVE_NO_ROOT_DIR) continue;

              tmp += “;” + dir; }

         return tmp;

    4. 打开对话框,选择文件路径函数 OnBrowse()

    BROWSEINFO  bi;

    char  dispname[MAX_PATH], path[MAX_PATH];

    ITEMIDLIST    *pidl;

    bi.hwndOwner = m_hWnd;

    bi.pidlRoot = 0;

    bi.pszDisplayName = dispname;

    bi.ulFlags = BIF_RETUREONLYFSDIRS | BIF_EDITBOX | BIF_DONTGOBELOWDOMAIN;

    bi.lpfn = 0;

    bi.lParam = 0;

    bi.iImage = 0;

    if(pidl = SHBrowseForFolder(&bi))  { //显示一个使用用户可以选择的文件打开对话框

      SHGetPathFromIDList(pidl, path); //把一个item identifier list转化为一个文件系统路径

      m_folder = CString(path);

      if(m_folder.IsEmpty() )   m_folder = GetAllDirverList();

      UpdateData(FALSE); }

    SHGetFileInfo(); 返回文件系统中对象的信息,比如文件、folder、路径、驱动器

     

    5. 如何使用CImageList 

    CImageList  m_iImageList;

    m_iImageList.Create(24,24,TRUE,1,0);

    HICON  hIcon = NULL;

    hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_KEBIAO0, IMAGE_ICON,24,24,0);

    m_iImageList.Add(hIcon);

    m_FileTree.SetImageList(&m_iImageList, TVSIL_NORMAL); //m_FileTreeTreeList控件

    //或者这样来创建:

    m_imageList.DeleteImageList();

    m_image.Create(16,16,ILC_COLORDDB,1,100);

    m_listCtrl.SetImageList(&m_iImageList, LVSIL_SMALL);

    6. 遍历一个文件夹的文件

    OnFindFile(WPARAM wParam, LPARAM  lParam) {

      CString  strFilePath = *((CString*)wParam);

      if(strFilePath.Right(1) != “\\”) {

         strFilePath +=”\\”; }

    strFilePath += “*.*”;

    CFileFind   finder;

    CString  strFileName;

    BOOL isHave = finder.FindFile(strFilePath);

    while(isHave)  {

         isHave = finder.FindNextFile();

         if(!finder.IsDirectory() && !finder.IsDots()) {

             strFileName = finder.GetFilePath();

             :: PostMessage((HWND)(GetMainWnd()->GetSafeHWnd()), WM_DISPLAY, (WPARAM)&strFileName, NULL);  }  }

    finder.Close();   }

    7. 如何来启动这个查找线程

    新建一个类派生于CWinThreadCFindFileThread *pFindFileThread;

    pFindFileThread = (CFindFileThread*)AfxBeginThread(RUNTIME_CLASS(CFindFileThread);

    pFindFileThread -> PostThreadMessage(WM_FINDFILE, (WPARAM)&strFilePath,NULL);

     

    8. 找到一个则发送消息WM_DISPLAY,并把文件中全路径作为参数返回

         获取一个文件的信息  OnDisplay(WPARAM  wParam, LPARAM  lParam) {

         count++; //统计文件个数

         CString  strFileName = *((CString*)wParam);

         CFileStatus  status;

         C: GetStatus(strFileName, status);

         CString  unit = “Byte”;

         float  flen = (float)status.m_size;

         if(flen>1024)  {

               flen /= 1024;

               if(flen < 1024)   unit = “KB”;

               else  {

                    flen /= 1024;

                    unit = “MB”; } }

          CString size;

          size.Format(“%1.2f”, flen);

          int  pos = strFileName.ReverseFind(‘\\’);

          SHFILEINFO  sfi;  //文件信息结构体

          if(:: SHGetFileInfo(strFileName, FILE_ATTRIBUTE_NORMAL, &sfi,

             Sizeof(SHFILEINFO), SHGFI_USEFILEATTRIBUTES |

              SHGFI_DISPLAYNAME | SHGFI_TYPENAME | SHGFI_ICON

                  | SHGFI_SMALLICON))  {

                m_imgList.Add(sfi.hIcon);

                m_filelist.InsertItem(count-1, sfi.szDisplayName, count-1);

                m_filelist.SetItemText(count-1, 1, strFileName, Mid(0,pos));

              m_filelist.SetItemText(count-1, 2, (size+unit));

              m_filelist.SetItemText(count-1, 3, sfi.szTypeName);  }

         m_filelist.Update(count-1);  }
     

    9. 在图片中隐藏信息的做法:加社会图片文件为c:\s.jpg, 文字为d:\w.txt, 在命令行方式窗口中输入命令   COPY  /B  C:\s.jpg + d:\w.txt   c:\d.jpg

    10. 获得应用程序所在路径

    char  szCurPath[_MAX_PATH];

    HINSTANCE  hInst = NULL;

    GetMoudleFileName( hInst, szCurPath, _MAX_PATH); //获得应用程序所在路径

    char  *p = szCurPath;

    while( strchr(p, ‘\\’)) {

          p= strchr( p, ‘\\’);

          p++;  }

    *p = ‘\0’;

    ShellExecute(NULL, NULL, _T(“Your.exe”), NULL, _T(szCurPath), SW_SHOWNORMAL);
     
    总结问题的解决方法,有助于获得更多的实战经验,不断地积累,在编程方面就会有长足的进步~!
    学习的过程是一个不断积累的过程,只有学习的时间累积到一定的程度,才能发生质的提高。。。
  • 相关阅读:
    第七届湘计算机程序设计竞赛的学生 报道称,数字游戏
    python IDE
    字符串处理
    Ajax得知(两)—— 一个简单的Ajax示例
    九度OJ 1068 球半径和数量 (模拟)
    centos 之7zip
    svnclient本地化和异常处理
    java web.xml listener servlet 和filter加载顺序
    Jquery zTree实例
    探索Android中的Parcel机制(上)
  • 原文地址:https://www.cnblogs.com/ccky/p/1307530.html
Copyright © 2020-2023  润新知