
在含有win32库的编译器中(例如vc++)包含windowsh文件 ,然后调用API函数MessageBox(HWND hWnd,LPCTSTR string,LPCTSTR title,DWORD controlID)即可创建一个简单对话框,实现你所想要的效果。例如,在VC中,想显示提示信息“计算机将在10秒内引爆”,标题是“警告”,只有一个“确定”按钮,那么可以调用:
MessageBox(NULL,"计算机将在10秒内引爆","警告",MB_OK)来实现
当然,当您日后对win32熟练后,可以有很多种方法实现的,祝您成功!
#include <tcharh>
#include <windowsh>
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)msgwParam;
}
// 注册应用程序窗口类
ATOM _RegisterClass()
{
WNDCLASSEX wc;
::ZeroMemory(&wc, sizeof(wc)); // 作为一步清空,是为了让未赋值的字段的默认值为(或NULL)
wccbSize = sizeof(wc);
wcstyle = CS_HREDRAW | CS_VREDRAW; // 指定当窗口横向和纵向的尺寸发生变化时都会重绘窗口
wchInstance = _HInstance;
wchbrBackground = (HBRUSH)( COLOR_APPWORKSPACE + 1); // 指定主窗口背景为“工作区域”系统颜色
wclpszClassName = _WindowClass; // 此为要注册的类名,创建窗口时要以此类名为标识符
wclpfnWndProc = _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));
wccbSize = sizeof(wc);
wcstyle = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS; // 指定当窗口尺寸发生变化时重绘窗口,并且响应鼠标双击事件
wchInstance = _HInstance;
wchbrBackground = (HBRUSH)(COLOR_WINDOW + 1); // 指定窗口背景颜色为系统颜色“窗口背景”
wclpszClassName = _TextBoxClass; // 指定要注册的窗口类名,创建窗口时要以此类名为标识符
wclpfnWndProc = _TextBoxWndProc; // 处理窗口消息的函数
return ::RegisterClassEx(&wc); // 调用API函数注册文本框窗口
}
// 创建文本框
HWND _CreateTextBoxWindow(HWND hParentWnd)
{
// 之下代码是为了让文本框显示在父窗口中央,而计算位置
RECT parentWndRect;
::GetClientRect(hParentWnd, &parentWndRect); // 获取父窗口客户区的位置
int left = (parentWndRectright - TEXTBOX_WIDTH) / 2, top = (parentWndRectbottom - 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(sizecx + 4 >= x)
break;
}
_StringPosition = strPos;
::GetTextExtentPoint(hDc, _String, strPos, &size);
::SetCaretPos(sizecx + 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 + sizecx, 3);
::ReleaseDC(hWnd, hDC);
}
void Menu()
{
system("cls"); /调用系统的清屏命令/
textbackground(BLUE);/将背景设置为蓝色/
textmode(2);
window(1,1,25,80);
clrscr();
textx=3;/光标初始化位置/
texty=2;
gotoxy(1,2);
cprintf("%c",218);/画左上角/
for(i=0;i<78;i++)
cprintf("%c",196); /画水平直线/
cprintf("%c",191);/画右上角/
for(i=3;i<=23;i++)
{
gotoxy(1,i);
cprintf("%c",179); /画垂直线/
gotoxy(80,i);
cprintf("%c",179);
}
cprintf("%c",192); /画左下角/
for(i=0;i<78;i++)
cprintf("%c",196);
cprintf("%c",217); /画右下角/
gotoxy(1,1);
textcolor(7); /设置灰色/
for(i=0;i<80;i++)
cprintf("%c",219);/用符号实现画主菜单的灰色背景区/
Selectitem(); /调用选项函数/
DrawSelectitem(); /画选项/
gettext(2,3,78,23,c); /保存当前文本区域/
}
/定义菜单/
void Selectitem()
{
strcpy(ml[0]name,"File");/下面的具体选项补空格是为了各菜单黑色背景相同/
strcpy(ml[0]str[0],"Open ALT-O");
strcpy(ml[0]str[1],"New ALT-N");
strcpy(ml[0]str[2],"Save Ctrl-S");
strcpy(ml[0]str[3],"Write to ");
strcpy(ml[0]str[4],"Exit ");
ml[0]n=5; /保存菜单的项数/
strcpy(ml[1]name,"Edit");
strcpy(ml[1]str[0],"Cut Ctrl+X");
strcpy(ml[1]str[1],"Copy Ctrl+C");
strcpy(ml[1]str[2],"Paste Ctrl+V");
strcpy(ml[1]str[3],"Find ");
strcpy(ml[1]str[4],"Find&Replace ");
ml[1]n=5;
strcpy(ml[2]name,"Help");/系统帮助/
strcpy(ml[2]str[0],"This System ");
strcpy(ml[2]str[1],"Ver ");
ml[2]n=2;
}
/显示主单名/
void DrawSelectitem()
{
for(i=0;i<3;i++)
RedText(i,1,ml[i]name); /显示主菜单名,且首字母为红色/
}
/正常显示菜单/
void RedText(int x,int y,char z)
{
textbackground(7); /设置背景颜色为浅灰色/
gotoxy(3+x20,y);
for(j=0;z[j];j++)
{
if(j==0)
textcolor(RED);/第一个字母显示红色/
else
textcolor(BLACK); /设置黑色/
cprintf("%c",z[j]); /输出菜单名/
}
}
/显示选中菜单/
void BlackText(int x,int y,char z)
{
textbackground(0); /设置背景颜色为黑色/
textcolor(15); /设置文本颜色为白色/
gotoxy(3+20x,y);/定位坐标/
cputs(z); /输出菜单名字符串/
}
/画边框函数/
void DrawFrame(int l,int u,int r,int d,int tcolor,int bcolor)
{
textbackground(bcolor); /背景颜色/
textcolor(bcolor); /文本颜色/
for(i=l;i<=r;i++) /输出背景区域/
{
for(j=u;j<=d;j++)
{
gotoxy(i,j);
cprintf("%c",219); /输出背景字符/
}
}
textcolor(tcolor);/边框颜色/
for(i=u+1;i<d;i++) /在背景区域内输出边框线/
{
gotoxy(l,i);
cprintf("%c",179); /垂直线/
gotoxy(r,i);
cprintf("%c",179);
}
for(i=l+1;i<r;i++)
{
gotoxy(i,u);
cprintf("%c",196); /水平线/
gotoxy(i,d);
cprintf("%c",196);
}
gotoxy(l,u);
cprintf("%c",218);/左上角/
gotoxy(r,u);
cprintf("%c",191);/右上角/
gotoxy(l,d);
cprintf("%c",192);/左下角/
gotoxy(r,d);
cprintf("%c",217); /右下角/
/ gettext(l+1,u+1,r-1,d-1,save1);//保存边框内区域/
}
/显示具体下拉选择项目/
void DrawMl(int n,charnodeptr L,rownodeptr R,pformateptr P,operationptr C,editptr E)
{
gettext(1,1,80,25,save);/保存被掩盖的地方/
BlackText(n,1,ml[n]name);/反选显示主菜单/
DrawFrame(3+20n-1,2,3+20n+19,3+ml[n]n,0,7);/下拉菜单的边框/
for(i=3;i<3+ml[n]n;i++)/输出所选菜单各选项/
{
if(i==3)
BlackText(n,i,ml[n]str[i-3]);/默认选中第一项/
else
RedText(n,i,ml[n]str[i-3]);/其余各项首字符红色显示/
}
gotoxy(79,1);
MoveMl(n,3,L,R,P,C,E);/菜单选项的控制/
}
/菜单选项的控制,n决定水平项,x决定下拉的选项/
void MoveMl(int n,int x,charnodeptr L,rownodeptr R,pformateptr P,operationptr C,editptr E)
{
int flag=1;
while(flag)
{
gotoxy(79,1);
key=bioskey(0);/接收按键/
gotoxy(79,1);
switch(key)
{
case ESC:/退出循环/
puttext(1,1,80,25,save);/恢复打开菜单前的样子/
flag=0;
break;
case LEFT:/移到左边的选项/
puttext(1,1,80,25,save);/恢复打开菜单前的样子/
if(n==0)/往左移动越界的话移到最后一个选项/
DrawMl(2,L,R,P,C,E);
else
DrawMl(n-1,L,R,P,C,E);
flag=0;
break;
case RIGHT:/移动右边的选项/
puttext(1,1,80,25,save);/恢复打开菜单前的样子/
if(n==2)/往右移动越界的话移到第一个选项/
DrawMl(0,L,R,P,C,E);
else
DrawMl(n+1,L,R,P,C,E);
flag=0;
break;
case UP:/具体选项往上移动/
RedText(n,x,ml[n]str[x-3]);/输出红色字体/
if(x==3)/移到最上面再按上键,就移到最下面/
x=3+ml[n]n-1;
else
x--;/移动到新的要显示的内容/
BlackText(n,x,ml[n]str[x-3]);/输出黑色字体/
flag=1;
break;
case DOWN:/具体选项往下移动/
RedText(n,x,ml[n]str[x-3]);
if(x==(3+ml[n]n-1))/移动到最底下再按下键就移到最上面/
x=3;
else
x++;/移动到新的要显示的内容/
BlackText(n,x,ml[n]str[x-3]);
flag=1;
break;
case ENTER:
puttext(1,1,80,25,save);/恢复打开菜单前的样子/
Enter(n,x-3,L,R,P,C,E);/菜单选项的具体功能/
flag=0;
break;
}
gotoxy(79,1);
}
}
/菜单选项的具体功能/
void Enter(int m,int n,charnodeptr L,rownodeptr R,pformateptr P,operationptr C,editptr E)
{
switch(m)
{
case 0:switch(n)
{
case 0:Openfile(L,R,P,C,E);break; /打开一个已存在的文件/
case 1:Newfile(L,R,P,C,E);break; /创建一个文件/
case 2:Savefile(L);break; /保存当前 *** 作和文件/
case 3:Writeto(L); /另存为/
case 4:Exit(L); /退出系统/
} break;
case 1: switch(n)
{
case 0: cut(L,R,P,C,E);break; /剪切/
case 1: copy(L,R,P,C,E);break; /复制/
case 2: paste(L,R,P,C,E);break; /粘贴/
case 3:find(L,R,P,C,E);break; /查找/
case 4:replace(L,R,P,C,E);break;/替换/
}break;
case 2:switch(n) /选择了帮助菜单选项/
{
case 0:Help();break;
case 1:Ver();
}
}/结束外switch/
}
//这是部分程序,如果要完整的例子程序,告诉我邮箱,我发给你
你到return前面加一句:system(sleep);这是调用DOS命令的。看得出来你刚接触编程,程序是顺序执行,从main函数开始执行,执行到return就结束了,程序也就关闭了。道理就是这样的!所以你还可以在return之前放一个死循环,让程序永远执行不到return,也可以做到同样的效果。例如while(1); 这样子就程序不会关闭了,但是会耗CPU,不推荐。些程序还是自己多思考,多动手的好,希望能对你有所帮助。
以上就是关于C语言有什么办法可以让程序执行后,有d窗,d窗上的字是我自己设的全部的内容,包括:C语言有什么办法可以让程序执行后,有d窗,d窗上的字是我自己设的、如何用c语言在控制台d出一个输入对话框、c语言制作d出式菜单等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)