c语言如何编写界面程序

c语言如何编写界面程序,第1张

C语方下可以在文本模式下作出,也可以在图形模式下画出,用的是一些扩展库,就是说不是C标准库,下面给一个框架,不知道建不建议学,感觉过时了,看你自已的兴趣了,感兴趣下了功夫肯定能学好,因为它根本就不难,只不过用了些非标准库的所谓高级函数镇辩而已

#include <process.h>

#include <dos.h>

#include <conio.h>

#define Key_DOWN 0x5100

#define Key_UP 0x4900

#define Key_ESC 0x011b

#define Key_ALT_F 0x2100

#define Key_ALT_X 0x2d00

#define Key_ENTER 0x1c0d

void box(int startx,int starty,int high,int width)

main()

{

int i,key,x,y,l

char *menu[] =

/* 主菜单各项 */

char *red[] = /* 加上红色热键 */

char *f[] =

/* File 项的子菜单 */

char buf[16*10*2],buf1[16*2] /* 定义保存文本的缓冲区 */

while(1)

{

textbackground(BLUE)

clrscr()

textmode(C80)

window(1,1,80,1)/* 定义显示主菜单的窗口 */

textbackground(LIGHTGRAY)

textcolor(BLACK)

clrscr()

gotoxy(5,1)

for(i=0,l=0i<8i++)

{

x=wherex() /* 得茄蔽到当前光标的坐标 */

y=wherey()

cprintf("%s",menu[i])/* 显示各菜单项 */

l=strlen(menu[i]) /* 得到菜单项的长度 */

gotoxy(x,y)

textcolor(RED)

cprintf("%s",red[i]) /* 在主菜单项各头字符写上红字符 */

x=x+l+5

gotoxy(x,y)

textcolor(BLACK) /* 为显示下一个菜单项移动光标 */

}

gotoxy(5,1)

key=bioskey(0)

switch (key){

case Key_ALT_X:

exit(0)/* ALT_X 则退出 */

case Key_ALT_F:

{

textbackground(BLACK)

textcolor(WHITE)

gotoxy(5,1)

cprintf("%s",menu[0]) /* 加黑 File 项 */

gettext(5,2,20,12,buf)/* 保存窗口原来的文本 */

window(5,2,20,9)/* 设置作矩形框的颤旅州窗口 */

textbackground(LIGHTGRAY)

textcolor(BLACK)

clrscr()

box(1,1,7,16) /* 调用作框函数 */

for(i=2i<7i++)/* 显示子菜单各项 */

{ gotoxy(2,i)

cprintf("%s",f[i-2])

}

gettext(2,2,18,3,buf1) /*将下拉菜单的内容保存在 buf1*/

textbackground(BLACK)

textcolor(WHITE)

gotoxy(2,2)

cprintf("%s",f[0])/*加黑下拉菜单的第一项 load file*/

gotoxy(2,2)

y=2

while ((key=bioskey(0))!=Key_ALT_X) /* 等待选择下拉菜单项*/

{

if ((key==Key_UP)||(key==Key_DOWN))

{

puttext(2,y,18,y+1,buf1) /* 恢复原先的项 */

if (key==Key_UP)

y=y==2?6:y-1

else

y=y==6?2:y+1

gettext(2,y,18,y+1,buf1)/*保存要压上光条的子菜单项*/

textbackground(BLACK)

textcolor(WHITE)

gotoxy(2,y)

cprintf("%s",f[y-2])/* 产生黑条压在所选项上 */

gotoxy(2,y)

}

else

if (key==Key_ENTER)/* 若是回车键,判断是哪一子菜单按的回

车,在此没有相应的特殊处理*/

{

switch ( y-1 ){

case 1: /* 是子菜单项第一项:Load file */

break

case 2: /* Save file */

break

case 3:/* print */

break

case 4: /* modify */

break

case 5:

exit(0)

default:

break

}

break

}

else

if (key==Key_ESC)

break/* 是 Esc 键,返回主菜单 */

}

if (key==Key_ALT_X) exit(0)

break

}

}

}

}

void box(int startx,int starty,int high,int width) /* 画矩形框函数 */

{ int i

gotoxy(startx,starty)

putch(0xda) /* 画┌ */

for (i=startx+1i<widthi++) putch(0xc4) /* 画— */

putch(0xbf) /* 画┐ */

for( i=starty+1i<highi++)

{

gotoxy(startx,i)putch(0xb3) /* 画│ */

gotoxy(width,i)putch(0xb3) /* 画│ */

}

gotoxy(startx,high)

putch(0xc0) /* 画└ */

for (i=startx+1i<widthi++) putch(0xc4) /* 画— */

putch(0xd9) /* 画┘ */

return

}

这是最简单的界面程序 : // c++.cpp : 定义应用程序的入口点。

//

#include "stdafx.h"

#include "c++.h"

#define MAX_LOADSTRING 100

// 全局变量:

HINSTANCE hInst // 当前实例

TCHAR szTitle[MAX_LOADSTRING] // 标题栏文本

TCHAR szWindowClass[MAX_LOADSTRING] // 主窗口类名

// 此代码模蠢没没块中包含的函数的前向声明:

ATOM MyRegisterClass(HINSTANCE hInstance)

BOOL InitInstance(HINSTANCE, int)

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM)

INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM)

int APIENTRY _tWinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPTSTR    lpCmdLine,

int       nCmdShow)

{

UNREFERENCED_PARAMETER(hPrevInstance)

UNREFERENCED_PARAMETER(lpCmdLine)

// TODO: 在此放置代码。

MSG msg

HACCEL hAccelTable

// 初始化全局字符串

LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING)

LoadString(hInstance, IDC_C, szWindowClass, MAX_LOADSTRING)

MyRegisterClass(hInstance)

// 执行应用程序初始化:

if (!InitInstance (hInstance, nCmdShow))

{

return FALSE

}

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_C))

// 主消息循环:

while (GetMessage(&msg, NULL, 0, 0))

{

if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))

{

TranslateMessage(&msg)

DispatchMessage(&msg)

}

}

return (int) msg.wParam

}

//

//  函数: MyRegisterClass()

//

//  目的: 注册窗口类。

//

//  注释:

//

//    仅当希望

//    此代码与添加到 Windows 95 中的“RegisterClassEx”

//    函数带纳之前的 Win32 系统兼容时,才需要此函数及其用法。调用此函数十分察中重要,

//    这样应用程序就可以获得关联的

//    “格式正确的”小图标。

//

ATOM MyRegisterClass(HINSTANCE hInstance)

{

WNDCLASSEX wcex

wcex.cbSize = sizeof(WNDCLASSEX)

wcex.style = CS_HREDRAW | CS_VREDRAW

wcex.lpfnWndProc = WndProc

wcex.cbClsExtra = 0

wcex.cbWndExtra = 0

wcex.hInstance = hInstance

wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_C))

wcex.hCursor = LoadCursor(NULL, IDC_ARROW)

wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1)

wcex.lpszMenuName = MAKEINTRESOURCE(IDC_C)

wcex.lpszClassName = szWindowClass

wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL))

return RegisterClassEx(&wcex)

}

//

//   函数: InitInstance(HINSTANCE, int)

//

//   目的: 保存实例句柄并创建主窗口

//

//   注释:

//

//        在此函数中,我们在全局变量中保存实例句柄并

//        创建和显示主程序窗口。

//

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)

{

HWND hWnd

hInst = hInstance // 将实例句柄存储在全局变量中

hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL)

if (!hWnd)

{

return FALSE

}

ShowWindow(hWnd, nCmdShow)

UpdateWindow(hWnd)

return TRUE

}

//

//  函数: WndProc(HWND, UINT, WPARAM, LPARAM)

//

//  目的: 处理主窗口的消息。

//

//  WM_COMMAND - 处理应用程序菜单

//  WM_PAINT - 绘制主窗口

//  WM_DESTROY - 发送退出消息并返回

//

//

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

int wmId, wmEvent

PAINTSTRUCT ps

HDC hdc

switch (message)

{

case WM_COMMAND:

wmId    = LOWORD(wParam)

wmEvent = HIWORD(wParam)

// 分析菜单选择:

switch (wmId)

{

case IDM_ABOUT:

DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About)

break

case IDM_EXIT:

DestroyWindow(hWnd)

break

default:

return DefWindowProc(hWnd, message, wParam, lParam)

}

break

case WM_PAINT:

hdc = BeginPaint(hWnd, &ps)

// TODO: 在此添加任意绘图代码...

EndPaint(hWnd, &ps)

break

case WM_DESTROY:

PostQuitMessage(0)

break

default:

return DefWindowProc(hWnd, message, wParam, lParam)

}

return 0

}

// “关于”框的消息处理程序。

INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)

{

UNREFERENCED_PARAMETER(lParam)

switch (message)

{

case WM_INITDIALOG:

return (INT_PTR)TRUE

case WM_COMMAND:

if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)

{

EndDialog(hDlg, LOWORD(wParam))

return (INT_PTR)TRUE

}

break

}

return (INT_PTR)FALSE

}

空窗口:

#include <windows.h>

/* 所有的窗口输出到这里去 */

LRESULT CALLBACK WndProc(HWND 手型hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {

switch(Message) {

/* 停止后,告诉主线程停止 */

case WM_DESTROY: {

PostQuitMessage(0)

break

}

/* 所有其他消息都使用默认程序处理 */

default:

return DefWindowProc(hwnd, Message, wParam, lParam)

}

return 0

}

/* Win32 GUI程序的主要功能:从这里开始执行 */

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {

WNDCLASSEX wc /* 窗口的属性结构 */

HWND hwnd /* "句柄" 一个窗口的标识符 */

MSG Msg /* 所有消息的临时位置 */

/* 修改结构和设置的东西 */

memset(&wc,0,sizeof(wc))

wc.cbSize  = sizeof(WNDCLASSEX)

wc.lpfnWndProc  = WndProc /* 发送消息的地方 */

wc.hInstance  = hInstance

wc.hCursor  = LoadCursor(NULL, IDC_ARROW)

/* 白毕明猜色,COLOR_WINDOW是系统定义的颜色值,其数值是5 */

wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1)

wc.lpszClassName = "WindowClass"

wc.hIcon  = LoadIcon(NULL, IDI_APPLICATION) /* 载入一个标准图标 */

wc.hIconSm  = LoadIcon(NULL, IDI_APPLICATION) /* 使用名称“A”来作为该项目图标 */

if(!RegisterClassEx(&wc)) {

MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK)

return 0

}

hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Caption",WS_VISIBLE|WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, /* x */

CW_USEDEFAULT, /* y */

640, /* 宽度 */

480, /* 高度 */

NULL,NULL,hInstance,NULL)

if(hwnd == NULL) {

MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK)

return 0

}

/*

所有的输入处理和发送到窗口过程。

注意,这个块代码流,直到它接收到的东西, 

所以回路槐码不会产生不合理的高CPU使用率。 

*/

while(GetMessage(&Msg, NULL, 0, 0) > 0) /* 如果没有收到任何错误…*/

{

TranslateMessage(&Msg) /* 如果存在翻译关键码字符*/

DispatchMessage(&Msg) /* 发送它到WndProc */

}

return Msg.wParam

}


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

原文地址: https://outofmemory.cn/yw/12392518.html

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

发表评论

登录后才能评论

评论列表(0条)

保存