本週 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以及實現簡單的限制已經足夠了 希望能對觀看者起到幫助作用^_^