如何用C语言做一个类似windows窗口
我想做一个比如像window窗口那样的可以最小化,也可以一半大小的窗口
一半大小后后面的窗口也可见。请问怎么实现呢?
问题点数:0、回复次数:29Top
1 楼fanbest(座天使长)回复于 2004-05-02 17:05:04 得分 0
我只会VC,只能用VC来做示范.
HWND ghWnd;
HDC ghDC;
HGLRC ghRC;
LONG WINAPI MainWndProc (HWND, UINT, WPARAM, LPARAM);
BOOL bSetupPixelFormat(HDC);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
WNDCLASS wndclass;
wndclass.style = 0; //代表窗口的风格,
wndclass.lpfnWndProc = (WNDPROC)MainWndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon (hInstance, szAppName);
wndclass.hCursor = LoadCursor (NULL,IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wndclass.lpszMenuName = szAppName;
wndclass.lpszClassName = szAppName;
if (!RegisterClass (&wndclass) )
return FALSE;
ghWnd = CreateWindow (szAppName,
"Programe Name",
WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
50,
50,
600,
600,
NULL,
NULL,
hInstance,
NULL);
if (!ghWnd)
return FALSE;
ShowWindow (ghWnd, nCmdShow);
UpdateWindow (ghWnd);
}
这样就做出来窗口。
如果想要定义窗口风格,就把style后边加上类如WS_MAXIMIZEBOX之类的语句就可。Top
2 楼freefalcon(心宇—消失中...)回复于 2004-05-02 20:14:37 得分 0
楼主想用C自己写吗?
用楼上的VC多方便
主要就是API的调用Top
3 楼PaulZhao(等咱阔了,养个日本人当宠物.)回复于 2004-05-02 20:24:59 得分 0
/* Creation of a simple Windows API program */
#include <windows.h>
/* Declare Windows procedure */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
/* Make the class name into a global variable */
char szClassName[ ] = "WindowsApp";
int WINAPI
WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nFunsterStil)
{
HWND hwnd; /* This is the handle for our window */
MSG messages; /* Here messages to the application are saved */
WNDCLASSEX wincl; /* Data structure for the windowclass */
/* The Window structure */
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */
wincl.style = CS_DBLCLKS; /* Catch double-clicks */
wincl.cbSize = sizeof (WNDCLASSEX);
/* Use default icon and mouse-pointer */
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL; /* No menu */
wincl.cbClsExtra = 0; /* No extra bytes after the window class */
wincl.cbWndExtra = 0; /* structure or the window instance */
/* Use Windows's default color as the background of the window */
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
/* Register the window class, and if it fails quit the program */
if (!RegisterClassEx (&wincl))
return 0;
/* The class is registered, let's create the program*/
hwnd = CreateWindowEx (
0, /* Extended possibilites for variation */
szClassName, /* Classname */
"Windows App", /* Title Text */
WS_OVERLAPPEDWINDOW, /* default window */
CW_USEDEFAULT, /* Windows decides the position */
CW_USEDEFAULT, /* where the window ends up on the screen */
544, /* The programs width */
375, /* and height in pixels */
HWND_DESKTOP, /* The window is a child-window to desktop */
NULL, /* No menu */
hThisInstance, /* Program Instance handler */
NULL /* No Window Creation data */
);
/* Make the window visible on the screen */
ShowWindow (hwnd, nFunsterStil);
/* Run the message loop. It will run until GetMessage() returns 0 */
while (GetMessage (&messages, NULL, 0, 0))
{
/* Translate virtual-key messages into character messages */
TranslateMessage(&messages);
/* Send message to WindowProcedure */
DispatchMessage(&messages);
}
/* The program return-value is 0 - The value that PostQuitMessage() gave */
return messages.wParam;
}
/* This function is called by the Windows function DispatchMessage() */
LRESULT CALLBACK
WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) /* handle the messages */
{
case WM_DESTROY:
PostQuitMessage (0); /* send a WM_QUIT to the message queue */
break;
default: /* for messages that we don't deal with */
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
Top
4 楼julyclyde(Java初学(大学不教只好自己学))回复于 2004-05-02 22:27:29 得分 0
94啊,用各GUI系统提供的多好啊
自己开发=浪费Top
5 楼Tomorrow0(Tomorrow0)回复于 2004-05-03 08:32:27 得分 0
我想楼主的意思是想知道如何用C来做,仅仅如此而已,不是你们认为的浪费资源和时间自己来开发Top
6 楼newegg2002(同志们,同胞们,大学的四年,是扎实基础的四年!!)回复于 2004-05-03 09:19:00 得分 0
单纯用C来作,,真是没有作过..只有VC的一点点经历,要不然还可以帮楼主一下的..Top
7 楼Wolf0403(废人:独活十年~心如刀割)回复于 2004-05-03 18:43:20 得分 0
单纯用 C 调用系统 API 来做是唯一的解决办法。Top
8 楼Wolf0403(废人:独活十年~心如刀割)回复于 2004-05-03 18:44:17 得分 0
所谓的“C 语言”本身连 IO 都不包括,还想做 GUI?Top
9 楼frost109(残阳)回复于 2004-05-06 23:27:16 得分 0
请问用C怎么调用api?
但我觉得调用api会不会失去c的特性
c是dos 的东西
到头来还得去调用window的东西Top
10 楼liubingqian(海风)回复于 2004-05-07 00:22:31 得分 0
看《Windows程序设计》Top
11 楼12l(十二嫂)回复于 2004-05-07 04:18:01 得分 0
支持楼主的钻研精神!!
用力的顶ing...Top
12 楼PaulZhao(等咱阔了,养个日本人当宠物.)回复于 2004-05-07 07:22:05 得分 0
frost109(残阳) :
!@#%%$&^%&*^%*&^(*&()*&^Top
13 楼PaulZhao(等咱阔了,养个日本人当宠物.)回复于 2004-05-07 07:23:01 得分 0
究竟看懂我贴的代码没有?Top
14 楼djwinter(独孤笨)回复于 2004-05-07 07:32:47 得分 0
我怎么从来没有听说c是dos的东西,好像人家linux95%都是用c,剩下的也不是用vc吧,好像还是用汇编等低级语言吧....
我不知道微软编写windows用的什么语言,但是我相信肯定不是用的vc, 怎么现在学习底层的东西都被看作是浪费精力与时间....我真是无语
楼主的要求当然不是调用api了,我想楼主的意思是在非图形界面下出一个窗口,就如同在dos下的edit软件那样,有自己的窗口,这个在计算机图形学里面描述过,但是必须在纯c界面下编译,不能用vc或者bc等的编译器,因为这些编译器不支持graphic.hTop
15 楼brtjiba(不是我)回复于 2004-05-07 08:42:48 得分 0
我怒,会api了不起啊?不过我想其实就好比djwinter(独孤笨)所说得那样,单纯的c自己本身还是做不了的,我想应该是c里面嵌套汇编语言直接调用dos中断通过bios进行绘图吧?表理那些调用api得人,如果你想创造就要往底层走,如果你想做代码搬运工请去调用api吧!如果只想画个图尔以那么就听楼上那些人说得去掉用api!如果是想学习底层工作原理我建议你先看看汇编,学会怎么与显示的本质打交道,那么到时候说不定你自己也可以写出类似graphic.h
这样的商业库得!呵呵!熬了一个通宵终于把剩下的<80x86汇编语言设计>看完。现在头晕晕的,语言组织不起来,如果得罪到一些人请大家见谅Top
16 楼xxxl()回复于 2004-05-07 09:49:51 得分 0
《windows程序设计》也是调用apiTop
17 楼fanbest(座天使长)回复于 2004-05-07 16:13:30 得分 0
这帮子人竟然想到用C调用汇编直接在屏幕上绘图,想以此画出一个窗口,并且还能改变大小,还能够拖动。。。。会这个简直就是高手高手高高手了。
你研究最底层的东西是没错,但不要超越自己现在的能力好不好,估计搂主现在也是对C一知半解,就不要去学习这些东西了,记住,太高深的武功没有好的内功基础强行修炼会走火入魔。Top
18 楼ShadowCpp(雨落清水)回复于 2004-05-09 13:29:53 得分 0
自己写个画点函数……
自己绘制窗口……
自己绘制按钮……
我自己曾经做过这样的东西。
就是没加入最大化最小化……
源代码还保留着……
如果需要帮忙,叫上我。QQ:9898989
另外,这样的事最好不要做太多了。
现在有了API确实比较方便,确实可以提高开发速度。
但是有些朋友不想被这样的黑盒思想困住,想知道如何制作此类东西。
我想,按C++之父的一句话说,不要把时间用在重新发明车轮这样的事上。 ^_^Top
19 楼wangwubian(查无此人)回复于 2004-05-09 15:52:34 得分 0
学习Top
20 楼flowercity(菜农)回复于 2004-05-09 19:34:35 得分 0
可以用C语言实现
DOS环境下运行的程序
我就在做这样的工作
主要是图形函数的使用
Top
21 楼yaozha(找不到你)回复于 2004-05-09 21:21:31 得分 0
可以的
我见过一个启动盘就是作到了窗口最大化最小化~~启动盘不可能调用api吧Top
22 楼djwinter(独孤笨)回复于 2004-05-09 21:45:27 得分 0
其实这些程序要自己编程实现可能是没有这个必要
但是假如不知道原理,只会调用函数确是万万不能,
虽然这个程序具体的我不会做,但是我记得我曾在一本计算机图形学中看到过实现方式
只是不记得书的具体名字了
Top
23 楼zjxiaoyu(alalei)回复于 2004-05-09 23:42:43 得分 0
呵呵.我是做手机软件开发的,里面的代码全是c和汇编..
当然window,menu这些东西全是用c写的..只要能把画一个象素的函数实现了,其他在这个基础上都能做出来.
DOS下一般是直接写显存吧.(好像显存的起始地址是0x80000...)
windows下不太好弄吧.不过只要知道了显示驱动上面的那层画点的函数就应该能做出来吧.
Top
24 楼imsheng(领舞格格)回复于 2004-05-10 01:24:13 得分 0
"只要能把画一个象素的函数实现了,其他在这个基础上都能做出来."
对的,,这是最基本的,,也是最关键的 ,,如果这个函数做好了,,整个画图程序也就搞定,,
Top
25 楼ShadowCpp(雨落清水)回复于 2004-05-10 10:55:30 得分 0
------------------------------
好像显存的起始地址是0x80000
------------------------------
……朋友,内存地址错了…… :)
16位编译器这个地址才对,显存的首地址……
char far *VideoBuffer = ( char far * ) ( 0xa0000000 );
32位编译器比如Watcom, DJGPP就用这个地址
char *VideoBuffer = ( char * ) ( 0xa0000 );
如果要做这样的东西,用32位编译器写吧推荐Watcom C可以不受内存限制。
但是如果分辨率高过320 * 200那么就要考虑显存换页了。
不过可以进行块状内存映射……速度快,就是麻烦点。
void point( int x, int y, unsigned char color )
{
/* 一个640 * 480直接访问显存高速写点函数 */
*( VideoBuffer + ( y << 9 ) + ( y << 7 ) + x ) = color;
}
还有方法比这个写点快得多……Top
26 楼piaozi2003()回复于 2004-05-10 11:11:17 得分 0
标准C中不不包括任何输入输出系统的,要画一个窗口要看你使用的操作系统和编译器。
如果OS是保护模式,那只能调用他的绘图函数,如是实模式,要么自己直接访问显卡,要么使用编译器提供的图形API,可以看看Linux下的X11R6界面Top
27 楼zjxiaoyu(alalei)回复于 2004-05-10 19:41:09 得分 0
受教.up.Top
28 楼10325(海上的云)回复于 2004-05-10 22:53:09 得分 0
既然想用C
高手就用C说的清楚点吧
不要用什么可视化的工具
这个大家都会Top




