20071027總結

本週 wpf中 主要是完成了對tab的學習 以及 從目錄中讀取更多文件信息的技巧.

然而到了週三,就又開始了新一輪的處理文檔運動。.

更令人驚詫的是 除了要寫文檔,一個數月前的項目又返回了一堆問題.而對於硬盤數據全丟的我來說  無疑是一次充分的摧殘.爲了 保持程序的不被修改.花了1晚上的工夫來研究如何從程序外部來操作程序中的各個控件. 好在之前研究過1段時間外掛.目的還算達到了.可是到了客戶那裏一調試.自己又傻了。原來哪個控件沒有把文本實時刷新到程序中去.結果一晚上的辛苦 對於解決當時的問題來講 白費了。

不過把期間的經驗技巧做一總結,日後自己或者網上的朋友肯定是能用的着的.

問題:尋找程序中的editbox併發送字符串.

思路分爲2個方向,一個是找到窗體handle然後 找到editbox handle通過 sendmessage發消息.

此方法可用於可以準確得到editbox handle的情況下.代碼如下:

HWND sipahwnd = ::FindWindow(NULL,"**系統");

 //char ab[100];// = "sdfdsf.jpg";
         //  strcpy(ab,_T("dsfdsf.jpg"));
 if (sipahwnd)
 {

  HWND dialoghwnd = ::FindWindow("#32770","打開圖像");
  if (dialoghwnd)
  {
   ::SetForegroundWindow(dialoghwnd);
             //得到此進程中的窗體句柄
   HWND edithwnd = ::FindWindowEx(dialoghwnd,0,"Edit",0);

   //遍歷得到下一個窗體句柄//getwindow(hwnd,gw_hwndnext);

            if(edithwnd)
   {     
           ::SendMessage(edithwnd,WM_SETTEXT,0,(LPARAM)SipaAdd);
   }

}

}

另外一種方法 得到主程序handle然後激活窗體 用粘貼板把 內容粘入.目前已經可以實現 複製,但是 在激活窗體方面遇到了問題.

   if (OpenClipboard())
   {
     HGLOBAL clipbuffer;
     char *buffer;
     EmptyClipboard();
     clipbuffer = GlobalAlloc(GMEM_DDESHARE,strlen(SipaAdd));
     buffer = (char *)GlobalLock(clipbuffer);
     strcpy(buffer,LPCSTR(SipaAdd));
     GlobalUnlock(clipbuffer);
     SetClipboardData(CF_TEXT,clipbuffer);
    CloseClipboard();
   }
   //把變量拷貝到粘貼版


            ::SetForegroundWindow(sipahwnd);
   ::SetFocus(sipahwnd);
   //::SetCursorPos(400,400);
   //Sleep(200);
   //::PostMessage(sipahwnd,WM_LBUTTONDOWN,1,MAKELONG(200,200));
   ::SendMessage(sipahwnd,WM_LBUTTONDOWN,0,0);
   Sleep(100);
   ::SendMessage(sipahwnd,WM_LBUTTONUP,0,0);

就在我對無法完成任務膽戰心驚的時候,突然之前backup的源代碼被我發現了。hoho天不絕我.

終於可以好好改了.

週末的時候基本就是忙着送文檔, 幫公司做(目前我所在地)各項目的收尾工作,與客戶交流.

找到了源代碼沒想到gdal不能使用.又用了1個多鐘頭把gdal重新配了1遍.事後才發覺.不能用的原因並不是gdal....不過也無所謂了,就當複習功課了 ^_^

週六,就是今天. 完成了mfc下限制字符串長度,以及限制特定輸入的操作。並簡單實現了vista下輸入序列號的那種輸入方式。話不多說:見代碼:

限制長度:

DDV_MaxChars(pDX, m_szffs, 20); DDV 是MFC用來處理數據檢測的一種簡單方法。

限制輸入:

int charpos = LOWORD(GetSel());
 CString str;
 GetWindowText(str);
 if (nChar >= '0' && nChar <= '9')
 {
  if (charpos == 4 || charpos ==7)
  {
   str.Insert(charpos,'-');
   SetWindowText(str);
   SetSel(charpos + 1,charpos + 1);
  }
  
  CEdit::OnChar(nChar, nRepCnt, nFlags);
 }
 else if (nChar == VK_BACK)
 {
   if (charpos == 5 || charpos ==8)
  {
   str.Delete(charpos-1,1);
   SetWindowText(str);
   SetSel(charpos - 1,charpos - 1);
  }
  
  CEdit::OnChar(nChar, nRepCnt, nFlags);
 }

此代碼實現了 輸入yyyy-mm-dd並會自動輸入- 但是沒有對ymd的範圍進行限制。且刪除方法不正確也會造成錯誤輸入。不過對於理解cedit以及實現簡單的限制已經足夠了 希望能對觀看者起到幫助作用^_^

 

 

 

發佈了12 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章