1. 如何用c語言在控制台彈出一個輸入對話框
#include <tchar.h>
#include <windows.h>
HINSTANCE _HInstance; // 應用程序句柄
TCHAR _Title[] = _T("簡單文本框"); // 定義窗口的標題
TCHAR _WindowClass[] = _T("MySimpleTextBoxApp");// 主窗口類名
ATOM _RegisterClass(); // 注冊主窗口類
HWND _CreateWindow(int nCmdShow); // 創建主窗口
LRESULT CALLBACK _WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); // 主窗口消息處理函數
TCHAR _TextBoxClass[] = _T("MySimpleTextBox"); // 文本框的類名
ATOM _RegisterTextBoxClass(); // 注冊文本框的類
HWND _CreateTextBoxWindow(HWND hParentWnd); // 創建文本框
LRESULT CALLBACK _TextBoxWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); // 文本框窗口消息處理函數
void _DrawText(HDC hDC); // 繪制文本
void _SetCaretPos(HWND hWnd); // 設置游標位置
void _UpdateWindow(HWND hWnd); // 更新窗口
// 一些常量定義
#define MAINWINDOW_WIDTH 400 // 主窗口寬度
#define MAINWINDOW_HEIGHT 200 // 主窗口高度
#define TEXTBOX_WIDTH 300 // 文本框寬度
#define TEXTBOX_HEIGHT 20 // 文本框高度
#define TEXTBOX_MAXLENGTH 1024 // 文本框中文本的最大長度
TCHAR _String[TEXTBOX_MAXLENGTH + 1] = _T(""); // 文本
int _StringPosition = ::_tcslen(_String); // 游標插入點所在的位置
int APIENTRY _tWinMain(HINSTANCE hInstance, // 當前的應用程序句柄
HINSTANCE hPrevInstance, // 前一個應用程序實例的句柄(在Win32上,始終為NULL)
LPTSTR lpCmdLine, // 命令行參數
int nCmdShow // 窗口的顯示樣式
)
{
_HInstance = hInstance;
_RegisterClass(); // 注冊窗口類
if(_CreateWindow(nCmdShow) == NULL) // 創建窗口
return FALSE;
MSG msg;
while (::GetMessage(&msg, NULL, 0, 0)) // 從消息隊列中獲取消息
{
::TranslateMessage(&msg); // 轉譯一些特殊的消息
::DispatchMessage(&msg); // 執行消息處理
}
return (int)msg.wParam;
}
// 注冊應用程序窗口類
ATOM _RegisterClass()
{
WNDCLASSEX wc;
::ZeroMemory(&wc, sizeof(wc)); // 作為一步清空,是為了讓未賦值的欄位的默認值為(或NULL)
wc.cbSize = sizeof(wc);
wc.style = CS_HREDRAW | CS_VREDRAW; // 指定當窗口橫向和縱向的尺寸發生變化時都會重繪窗口
wc.hInstance = _HInstance;
wc.hbrBackground = (HBRUSH)( COLOR_APPWORKSPACE + 1); // 指定主窗口背景為「工作區域」系統顏色
wc.lpszClassName = _WindowClass; // 此為要注冊的類名,創建窗口時要以此類名為標識符
wc.lpfnWndProc = _WndProc; // 此為處理窗口消息的函數
return ::RegisterClassEx(&wc); // 調用API函數注冊窗口類
}
// 創建窗口
HWND _CreateWindow(int nCmdShow)
{
HWND hWnd = ::CreateWindow(_WindowClass, _Title, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, MAINWINDOW_WIDTH, MAINWINDOW_HEIGHT, NULL, NULL, _HInstance, NULL);
if(hWnd == NULL)
return NULL;
::ShowWindow(hWnd, nCmdShow);
::UpdateWindow(hWnd);
return hWnd;
}
// 窗口處理過程
LRESULT CALLBACK _WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HWND hTextBoxWnd;
switch (message)
{
case WM_CREATE: {
_RegisterTextBoxClass(); // 注冊文本框的類
hTextBoxWnd = _CreateTextBoxWindow(hWnd); // 創建文本框
} break;
case WM_ACTIVATE: // 當窗口被激活時,將焦點設置在文本框上
::SetFocus(hTextBoxWnd);
break;
case WM_SETCURSOR: { // 設置游標形狀
static HCURSOR hCursor = ::LoadCursor(NULL, IDC_ARROW);
::SetCursor(hCursor);
} break;
case WM_DESTROY: // 應用程序被關閉
::PostQuitMessage(0);
break;
default:
return ::DefWindowProc(hWnd, message, wParam, lParam);
}
return (LRESULT)0;
}
// 注冊文本框的類
ATOM _RegisterTextBoxClass()
{
WNDCLASSEX wc;
::ZeroMemory(&wc, sizeof(wc));
wc.cbSize = sizeof(wc);
wc.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS; // 指定當窗口尺寸發生變化時重繪窗口,並且響應滑鼠雙擊事件
wc.hInstance = _HInstance;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); // 指定窗口背景顏色為系統顏色「窗口背景」
wc.lpszClassName = _TextBoxClass; // 指定要注冊的窗口類名,創建窗口時要以此類名為標識符
wc.lpfnWndProc = _TextBoxWndProc; // 處理窗口消息的函數
return ::RegisterClassEx(&wc); // 調用API函數注冊文本框窗口
}
// 創建文本框
HWND _CreateTextBoxWindow(HWND hParentWnd)
{
// 之下代碼是為了讓文本框顯示在父窗口中央,而計算位置
RECT parentWndRect;
::GetClientRect(hParentWnd, &parentWndRect); // 獲取父窗口客戶區的位置
int left = (parentWndRect.right - TEXTBOX_WIDTH) / 2, top = (parentWndRect.bottom - TEXTBOX_HEIGHT) / 2;
// 創建文本框
HWND hWnd = ::CreateWindow(_TextBoxClass, NULL, WS_CHILDWINDOW | WS_VISIBLE,
left, top, TEXTBOX_WIDTH, TEXTBOX_HEIGHT,
hParentWnd, NULL, _HInstance, NULL);
return hWnd;
}
// 文本框消息的處理過程
LRESULT CALLBACK _TextBoxWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_PAINT: { // 繪制這里之所以加一對大括弧,是為了讓之下定義的變數局部化
static PAINTSTRUCT ps;
static RECT rect;
HDC hDC = ::BeginPaint(hWnd, &ps); // 開始繪制操作
::GetClientRect(hWnd, &rect); // 獲取客戶區的尺寸
::DrawEdge(hDC, &rect, EDGE_SUNKEN, BF_RECT); // 繪制邊框,EDGE_SUNKEN表示繪制樣式為內嵌樣式,BF_RECT表示繪制矩形邊框
_DrawText(hDC); // 繪制文本
::EndPaint(hWnd, &ps); // 結束繪制操作
} break;
case WM_SETFOCUS: { // 獲得焦點
::CreateCaret(hWnd, (HBITMAP)NULL, 1, TEXTBOX_HEIGHT-5); // 創建游標
_SetCaretPos(hWnd); // 設置游標位置
::ShowCaret(hWnd); // 顯示游標
} break;
case WM_KILLFOCUS: // 失去焦點
::HideCaret(hWnd); // 隱藏游標
::DestroyCaret(); // 銷毀游標
break;
case WM_SETCURSOR: { // 設置游標形狀
static HCURSOR hCursor = ::LoadCursor(NULL, IDC_IBEAM);
::SetCursor(hCursor);
} break;
case WM_CHAR: { // 字元消息
TCHAR code = (TCHAR)wParam;
int len = ::_tcslen(_String);
if(code < (TCHAR)' ' || len >= TEXTBOX_MAXLENGTH)
return 0;
::MoveMemory(_String + _StringPosition + 1, _String + _StringPosition, (len - _StringPosition + 1) * sizeof(TCHAR));
_String[_StringPosition ++] = code;
_UpdateWindow(hWnd);
_SetCaretPos(hWnd);
} break;
case WM_KEYDOWN: { // 鍵按下消息
TCHAR code = (TCHAR)wParam;
switch (code)
{
case VK_LEFT: // 左游標鍵
if(_StringPosition > 0)
_StringPosition --;
break;
case VK_RIGHT: // 右游標鍵
if(_StringPosition < (int)::_tcslen(_String))
_StringPosition ++;
break;
case VK_HOME: // HOME 鍵
_StringPosition = 0;
break;
case VK_END: // END 鍵
_StringPosition = ::_tcslen(_String);
break;
case VK_BACK: // 退格鍵
if(_StringPosition > 0)
{
::MoveMemory(_String + _StringPosition - 1, _String + _StringPosition, (::_tcslen(_String)-_StringPosition + 1) * sizeof(TCHAR));
_StringPosition --;
_UpdateWindow(hWnd);
}
break;
case VK_DELETE: { // 刪除鍵
int len = ::_tcslen(_String);
if(_StringPosition < len)
{
::MoveMemory(_String + _StringPosition, _String + _StringPosition + 1, (::_tcslen(_String) - _StringPosition + 1) * sizeof(TCHAR));
_UpdateWindow(hWnd);
}
} break;
}
_SetCaretPos(hWnd);
} break;
case WM_LBUTTONDOWN: { // 滑鼠單擊,設置游標位置
int x = LOWORD(lParam);
HDC hDc = ::GetDC(hWnd);
int strLen = ::_tcslen(_String), strPos = 0;
SIZE size;
for (strPos=0; strPos<strLen; strPos++)
{
::GetTextExtentPoint(hDc, _String, strPos, &size);
if(size.cx + 4 >= x)
break;
}
_StringPosition = strPos;
::GetTextExtentPoint(hDc, _String, strPos, &size);
::SetCaretPos(size.cx + 4, 3);
::ReleaseDC(hWnd, hDc);
} break;
default:
return ::DefWindowProc(hWnd, message, wParam, lParam);
}
return (LRESULT)0;
}
// 更新窗口
void _UpdateWindow(HWND hWnd)
{
RECT rect;
::GetClientRect(hWnd, &rect);
::InvalidateRect(hWnd, &rect, TRUE);
::UpdateWindow(hWnd);
}
// 繪制文本
void _DrawText(HDC hDC)
{
int len = ::_tcslen(_String);
::TextOut(hDC, 4, 2, _String, len);
}
// 設置游標位置
void _SetCaretPos(HWND hWnd)
{
HDC hDC = ::GetDC(hWnd);
SIZE size;
::GetTextExtentPoint(hDC, _String, _StringPosition, &size);
::SetCaretPos(4 + size.cx, 3);
::ReleaseDC(hWnd, hDC);
}
2. C語言如何彈出提示框
直接調用系統APIMessageBox()函數就可以了。函數原形intWINAPIMessageBox(HWNDhWnd,LPCTSTRlpText,LPCTSTRlpCaption,UINTuType);參數說明hWnd:消息框的擁有窗此參數口。如果為NULL,則消息框沒有擁有窗口。
lpText:消息框的內容。
lpCaption:消息框的標題。
uType:指定一個決定對話框的內容和行為的位標志集。此參數可以為下列標志組中標志的組合。指定下列標志中的一個來顯示消息框中的按鈕以及圖標。MB_OK默認值。有一個確認按鈕在裡面。MB_YESNO有是和否在裡面。
MB_ABORTRETRYIGNORE有Abort(放棄),Retry(重試)和Ignore(跳過)
MB_YESNOCANCEL消息框含有三個按鈕:Yes,No和CancelMB_RETRYCANCEL有Retry(重試)和Cancel(取消)
MB_OKCANCEL消息框含有兩個按鈕:OK和CancelC語言是一門通用計算機編程語言,應用廣泛。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。盡管C語言提供了許多低級處理的功能,但仍然保持著良好跨平台的特性,以一個標准規格寫出的C語言伏稿程序可在許多電腦平台上進行編譯,甚至包含一些嵌入式處理器(單片機或稱MCU)以及超級電腦等作業平台。二山肢十世紀八十年代,為了避免各開發廠商用的C語言語法產生差缺唯孝異,由美國國家標准局為C語言制定了一套完整的美國國家標准語法,稱為ANSIC,作為C語言最初的標准。目前2011年12月8日,國際標准化組織(ISO)和國際電工委員會(IEC)發布的C11標準是C語言的第三個官方標准,也是C語言的最新標准,該標准更好的支持了漢字函數名和漢字標識符,一定程度上實現了漢字編程。
3. 如何用c語言生成一個對話框
用vc6文件->新建->工程(projects)->MFC AppWizard[exe]->基於對話框(dialog based)
單擊下面的「完成」(finish) 手動添加控制項和寫代碼
4. 如何用c語言生成一個對話框
/*
MessageBox
彈框函數
MessageBox
(NULL,TEXT("窗口內容"),
TEXT("窗口標題"),
圖標|按鈕);
*/
#
include
#
include
//
包含頭文件:Windows.h
int
main
(void)
{
MessageBox
(NULL,TEXT("歡迎使用本軟體"),
TEXT("歡迎"),MB_OK);//只有OK
/*
按鈕參數:
MB_OK
有一個「確定」在框裡面
MB_YESNO
有「是」和「否」在裡面
MB_ABORTRETRYIGNORE
有Abort(放棄),Retry(重試)和Ignore(跳過)在裡面
MB_YESNOCANCEL
有「是」和「否」和「取消」在裡面
MB_RETRYCANCEL
有「重試」和「取消」
在裡面
MB_OKCANCEL
有「確定」和「取消」在裡面
返回值:
按下的按鈕
返回的值
確定
1
取消
2
放棄
3
重試
4
跳過
5
是
6
否
7
*/
int
i
=
MessageBox
(NULL,TEXT("按「確定」輸出
6,按「取消」輸出
7"),
TEXT("你好"),MB_YESNO);
printf("%d\n",i);
/*
圖標:
MB_ICONEXCLAMATION
一個驚嘆號出現在消息框
MB_ICONWARNING
一個驚嘆號出現在消息框
MB_ICONINFORMATION
一個圓圈中小寫字母i組成的圖標出現在消息框
MB_ICONASTERISK
一個圓圈中小寫字母i組成的圖標出現在消息框
MB_ICONQUESTION
一個問題標記圖標出現在消息框
MB_ICONSTOP
一個停止消息圖標出現在消息框
MB_ICONERROR
一個停止消息圖標出現在消息框
MB_ICONHAND
一個停止消息圖標出現在消息框
*/
MessageBox
(NULL,TEXT("你是豬嗎?"),
TEXT("問題"),MB_ICONQUESTION|MB_YESNO);//註:圖標在前,按鈕在後。中間用「|」分割。
return
0;
}
5. Web自動化中,怎麼才能處理彈出的模態對話框
如何為webbrowser中彈出的模態網頁對話框添加自動化方法?
我用CDHtmlDialog做基類,做了一個簡單瀏覽器,通過以下幾步,添加了自動化方法MyFunc
C/C++ code
///////////////////////////////////////////1、類聲明文件中添加DECLARE_DISPATCH_MAP()添加響應函數聲明,如void MyFunc(char* sURL);重載CanAccessExternalvirtual BOOL CanAccessExternal();2、構造函數添加EnableAutomation();初始化添加SetExternalDispatch(GetIDispatch(TRUE));消息映射添加BEGIN_DISPATCH_MAP(CDlgIE, CDHtmlDialog) //彈出窗口介面 DISP_FUNCTION(CDlgIETooltip, "MyFunc", MyFunc, VT_EMPTY, VTS_BSTR) // example: // DISP_FUNCTION(CMyDHTMLDialog,"Func2",TestFunc,VT_BOOL,VTS_BSTR VTS_I4 VTS_I4) // ^return, ^parameters type listEND_DISPATCH_MAP()實現CanAccessExternal重載BOOL CDlgIE::CanAccessExternal(){ return TRUE;}最後實現響應函數MyFunc////////////////////////////////////////////////////////////////////
這樣,在網頁中就可以使用external.MyFunc("參數")來調用我的瀏覽器提供的方法
現在問題是,如果網頁中用showModalDialog彈出一個網頁對話框,在網頁對話框中就無法調用external.MyFunc方法
一種解決方案是將window在showModalDialog時傳入,然後在對話框中調父頁面的方法,但是我的頁面有時是跨域的,無法取到父頁面的window。
所以現在想最好能把網頁對話框的webbrowser控制項也加入我自定義的交互函數,想了很久,也找了很久,沒有找到解決方案,想請各位幫幫忙,謝謝。
現在可以用hook得到網頁對話框的窗口消息,但不知該如何給webbrowser加網頁的消息映射
6. C語言中對話框的問題
#include"windows.h"
intmain(void)
{
MessageBox(NULL,TEXT("hello,word"),TEXT("對話框"),MB_OK);
return0;
}
是這么用的。。我剛剛測試了