C语言有什么办法可以让程序执行后,有d窗,d窗上的字是我自己设的

C语言有什么办法可以让程序执行后,有d窗,d窗上的字是我自己设的,第1张

在含有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出式菜单等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9470261.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存