Windows之設置EDITTEXT為只讀模式

Windows之設置EDITTEXT為只讀模式

近日需要把文本輸入框(EDITTEXT)設為不可編輯,也就是只讀模式.發現在Dialog下無法啟用,並且在WM_INITDIALOG設置STYLE也無作用.下面給出設置方法:

  1. HWND hWnd = CreateDialog();創建Dialog後
  2. hWnd hEdit= ::GetDlgItem(hWnd,IDDEIT);
  3. SendMessage(hEdit,EM_SETREADONLY,true,0);
  4. WPARAM設為TRUE則啟用只讀模式,設為FALSE則啟用編輯模式

Windows文件拖放

Windows文件拖放

近日要實現文件拖放,如果只實現接收則較為簡單,下麵把實現原理記下.

  1. 令主窗口可以接受文件拖放::DragAcceptFiles(hWnd,TRUE);
  2. 處理WM_DROPFILES消息wParam為HDROP文件拖放句柄
  3. 獲取拖放文件的個數::DragQueryFile(hdrop,-1,NULL,0);
  4. 獲取拖放文件的路徑DragQueryFile(hdrop,File_Index,File_Path,sizeof(File_Path));
  5. 處理拖放文件File_Path
  6. 重複第四第五步提取拖放文件的路徑
  7. 釋放拖放空間::DragFinish(hdrop);

 

int Query_DragAndDrop(HDROP  hdrop,PROC_DRAGANDDROP Proc_DragAndDrop)

{

int  File_Num;

TCHAR File_Path[2056];

int  File_Index;

File_Num = ::DragQueryFile(hdrop,-1,NULL,0);// 獲取文件個數

for(File_Index = 0; File_Index < File_Num; ++File_Index)

{ // 獲取拖放文件

::DragQueryFile(hdrop,File_Index,File_Path,sizeof(File_Path));

Proc_DragAndDrop(File_Path);// 處理文件

}

::DragFinish(hdrop);// 釋放空間

return 1;

}

HASH校驗器

HASH校驗器

HASH(哈希碼)用於生成文件的指紋,如果兩個文件的哈希碼一致,則代表文件是相同的.令外也用於生成密碼指紋.此軟件用於生成文件的哈希碼,支持SHA1,SHA256,SHA384,SHA512,MD5,MD4,MD2,CRC32,CRC64.大部分的哈希校驗碼是我在2009年所寫.所以此軟件製作較順利.加入文件拖放和拷貝剪貼板,全部使用純C代碼所寫速度快,體積小.

Win32版下載:HASH

 

Windows設置按扭圖標

Windows設置按扭圖標

按扭BUTTON可以設定圖標,但有幾點需要需注意:

  1. 準備一張ICO圖標
  2. 在你VC工程目標下創建ICON文件夾,把ICO圖標複製於此.
  3. 把ICO圖標編譯進程序,在RC文件加上IDR_LOGO ICON        “ICO\\logo.ico”
  4. 按扭BUTTON樣式style需加上BS_ICON
  5. 獲取應用實例句柄HMODULE hModule = ::GetModuleHandle(0);
  6. 獲取ICON圖標句柄HICON hIcon = ::LoadIcon(hModule,_T(”IDR_LOGO”));
  7. 設置按扭圖標::SendMessage(hWnd, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon);

SEO外鏈蜘蛛

SEO外鏈蜘蛛

外鏈即指向您的網站的連結,它確定你從搜索引擎獲得多小流量.但要獲得大量的外鏈並不容易,而對於個人Blog(博客)應把精力集中于文章的質量而不是把精力用於增加外鏈.但個人博客主可以通過域名查詢網站增加外鏈,通過查詢域名流下查詢記錄,並產生一條指向你域名鏈接,而域名查詢網站首頁也會產生最新查詢鏈接,如果搜索引擎剛好來訪,你的外鏈就會增加.但天天查詢網站域名更會耗費大量精力,不過你可以製作全自動化域名查詢蜘蛛.下麵給出軟件的製作思路.

  1. 把域名查詢網站保存於文本數據庫
  2. 在圖形界面放置ComboBox下拉文本輸入框,用於輸入域名.
  3. 域名前面不加”HTTP://”後面不添加”/”
  4. 獲取默認瀏覽器路徑
  5. 創建新的線程_beginthread()
  6. 讀取一條記錄fgets()
  7. 啟動瀏覽器並打開網頁
  8. 等待30秒
  9. 關閉瀏覽器
  10. 重複第6至9步

Windows對話框圖標

Windows對話框圖標

對話框圖標在模板中不能設置,需要

1.       準備一張512×512圖片

2.       使用IconWorkshop轉換成ICO圖標

3.       分辯率勾選48×48,32×32,24×24,16×16,位數32Bit(RGBA),16Bit,8Bit(256色)即可.

4.       在你VC工程目標下創建ICON文件夾,把ICO圖標複製於此.

5.       在RSOURCE.RC文件加上,要注意第一條記錄也是應用圖標

IDR_MAINFRAME     ICON        “ICO\\logo.ico”

6.       在對話框WM_INITDIALOG設置

HICON hIcon = LoadIcon(main_instance,_T(“IDR_MAINFRAME”));//載入圖標

::SendMessage(hWnd, WM_SETICON, true, (LPARAM)hIcon);//設置大圖標

::SendMessage(hWnd, WM_SETICON, false, (LPARAM)hIcon);//設置小圖標

Windows輕量級文本數據庫

Windows輕量級文本數據庫

如果程式需要讀取大量數據可使用SQLite3關係數據庫,但如果只是讀寫小量文本數據,則使用文本一行行地保存文本更方便,擴展名最好改為.db下麵給設計思路.

讀取文本數據

  1. 以文本只讀方式打開文件_wfopen(),使用寬字符版路徑帶有中文也可打開,
  2. 讀取一行文本fgets()並進行處理
  3. 循環第二步,如返回NULL則讀取完畢.
  4. 關閉文件句柄fclose()

寫入文本數據

  1. 以文本寫入方式打開文件_wfopen(),模式使用w代表文件長度清零,否則使用a在文件尾寫入數據
  2. 寫入一行文本fputs()
  3. 寫入換行fputs(“\n”,stream);
  4. 循環第二第三步,如返回NULL則讀取完畢.
  5. 關閉文件句柄fclose()

 

讀取文本的C代碼

bool Read_DB()

{

FILE * stream=NULL; // 文件流句柄

char text[2056];

stream = _wfopen(L”text.dat”,L”r+t”);// 以文本方式打開文件

if(stream == NULL)

return false;// 無法打開文件

// 讀取一行

while(fgets(text,sizeof(text),stream) != NULL)

{  //去除字符串中最後面 “換行符”  “空格”

TrimRight(text);

// 處理文本

// ……….

}

fclose(stream); // 關閉文件句柄

return true;

}

追加一行文本的C代碼

bool Save_DB(char * text)

{

FILE * stream=NULL; // 文件流句柄

// 以文本方式打開文件

stream = _wfopen(L”text.dat”,L”a+t”);

if(stream == NULL)

return false;// 無法打開文件

::fputs(text,stream);// 寫入數據

::fputs(“\n”,stream);// 換行

fclose(stream);// 關閉文件句柄

return true;

}

Windows對話框在屏幕居中顯示

Windows對話框在屏幕居中顯示

對話框(DIALOG)模板可以設定顯示位置,但因屏幕大小不一,總想讓對話框在屏幕居中顯示.

  1. 獲取窗口的矩形區域GetWindowRect(),計算窗口的寬和高
  2. 獲取屏幕寬和高GetSystemMetrics()
  3. 重新設置窗口位置

下面給出C源代碼便於移值到其它工程

bool CentreWindow(HWND hWnd)

{

RECT rect;

int width,height;

int x,y;

if(IsWindow(hWnd) == false)

return false;

::GetWindowRect(hWnd,&rect); // 獲取窗口的

width  = rect.right – rect.left; // 計算窗口寬度

height = rect.bottom – rect.top; // 計算窗口高度

x = GetSystemMetrics(SM_CXSCREEN)/2-width/2;// 計算窗口居中X

y = GetSystemMetrics(SM_CYSCREEN)/2-height/2;// 計算窗口居中Y

SetWindowPos(hWnd,HWND_TOP,x,y,0,0,SWP_NOSIZE);  // 移動窗口

return true;

}

Windows啟動瀏覽器並打開網頁

Windows啟動瀏覽器並打開網頁

啟動瀏覽器最簡單的方法是使用ShellExecute(),但無返回進程句炳,要關閉瀏覽器只能查找窗口.更好的方法是CreateProcess()啟動瀏覽器新進程並打帶網頁,並返回進程句柄,方便關閉瀏覽器.

BOOL CreateProcess(LPCTSTR lpApplicationName,//執行模塊名填空NULL即可

LPTSTR  lpCommandLine,//命令行填”瀏覽器Path+空格+網頁URL”

LPSECURITY_ATTRIBUTES lpProcessAttributes,//進程屬性  LPSECURITY_ATTRIBUTES lpThreadAttributes,//線程屬性

BOOL bInheritHandles,  //繼承進程句柄false

DWORD dwCreationFlags, //創建標誌填CREATE_NEW_CONSOLE

LPVOID lpEnvironment, //進程環境

LPCTSTR lpCurrentDirectory,// 進程的工作路徑填NULL

LPSTARTUPINFO lpStartupInfo, //STARTUPINFO結構

LPPROCESS_INFORMATION lpProcessInformation//PROCESS_INFORMATION結構

);

  1. 要注意的是命令行lpCommandLine:瀏覽器Path+空格+網頁URL
  2. 命令行最好使用寬字符Unicode否則路徑有漢字或非ASCII碼則無法運行
  3. 返回不為false則調用成功
  4. 保存lpProcessInformation返回瀏覽器新進柄

 

下麵給打開網頁源代碼,便於

bool Open_Url(char * url,char * browser_Path)

{

int result = 0;

char CommandA[2056];

WCHAR CommandW[2056];

int length;

SECURITY_ATTRIBUTES Security_Attributes_Process;// 進程屬性

SECURITY_ATTRIBUTES Security_Attributes_Thread;// 線程屬性

STARTUPINFO        Startup_Info;// 啟動信息

PROCESS_INFORMATION Process_Information;//  進程信息

strcpy(CommandA,browser_Path);

strcat(CommandA,” “);

strcat(CommandA,url);

// 轉換UNICODE

length = MultiByteToWideChar(CP_ACP, NULL, CommandA, strlen(CommandA), CommandW, sizeof(CommandW));

CommandW[length] = NULL;

// 進程屬性

Security_Attributes_Process.nLength              = sizeof(SECURITY_ATTRIBUTES);

Security_Attributes_Process.lpSecurityDescriptor = NULL;

Security_Attributes_Process.bInheritHandle       = true;

// 線程屬性

Security_Attributes_Thread.nLength               = sizeof(SECURITY_ATTRIBUTES);

Security_Attributes_Thread.lpSecurityDescriptor  = NULL;

Security_Attributes_Thread.bInheritHandle        = true;

// 啟動信息

ZeroMemory( &Startup_Info, sizeof(STARTUPINFO) );

Startup_Info.cb = sizeof(STARTUPINFO);

ZeroMemory( &Process_Information, sizeof(PROCESS_INFORMATION) );

// 創建進程

result = CreateProcessW(NULL,

CommandW,

&Security_Attributes_Process,

&Security_Attributes_Thread,

FALSE,

CREATE_NEW_CONSOLE,

NULL,

NULL,

&Startup_Info,

&Process_Information);

// 獲取進程句柄

if(result != 0)

return true;

else

return false;

}

Windows 默認瀏覽器路徑

Windows 默認瀏覽器路徑

Windows默認瀏覽器的路徑在註冊表(REGEDIT.EXE)的HKEY_CLASSES_ROOT\http\shell\open\command\,提取數據需要使用下面三個註冊表操作函數.並給出設計思路源碼

  1. 打開註冊表句柄RegOpenKeyEx()
  2. 提取數據RegQueryValueEx()
  3. 關閉註冊表句柄RegCloseKey()
  4. 提取在雙引號中的瀏覽器路徑

 

char   Browser_Path[2056];// 瀏覽器路徑

// ————————————————————–

// 獲取系統默認瀏覽器路徑

// ————————————————————–

char * Get_WebBrowserPath_SEO(void)

{

long ret;

HKEY hKey;// 註冊表句柄

WCHAR path[2056];//

char  data[2056];

DWORD length;

// 打開註冊表

// HKEY_CLASSES_ROOT\http\shell\open\command

ret = RegOpenKeyExW(HKEY_CLASSES_ROOT,L”http\\shell\\open\\command”,0,KEY_ALL_ACCESS,&hKey);

if(ret != ERROR_SUCCESS)

return NULL;

// 獲取REG_SZ

DWORD type = REG_SZ;//類型

length = sizeof(path);//

ret = RegQueryValueExW(hKey,NULL,NULL,&type,(PBYTE)path,&length);

if(ret != ERROR_SUCCESS)

return NULL;

// 關閉註冊表句柄

RegCloseKey(hKey);

// 轉換為UTF-8

length  = WideCharToMultiByte(CP_UTF8, NULL, path, wcslen(path), data, sizeof(data), NULL, NULL);

data[length] = NULL;

// 清零

memset(Browser_Path,0,sizeof(Browser_Path));

// 提取路徑

for(int i = 0,index = 0;i<(int)length; ++i)

{

if(data[i] == ‘”‘ && index != 0)

break;// 讀取完畢跳出

if(data[i] != ‘”‘)

{

Browser_Path[index] = data[i];

++index;

}

}

return Browser_Path;// 返回路徑

}