CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

如何用C语言做一个类似windows窗口

楼主frost109(残阳)2004-05-02 13:40:27 在 C/C++ / C语言 提问

我想做一个比如像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

相关问题

  • C 语言能用于WINDOWS编程吗
  • 怎样让C语言编写的程序在WINDOWS下执行时不显示DOS窗口。
  • 学C语言。。。
  • C语言书!
  • vc2005调试c语言,显示窗口问题!!1
  • UNIX下的C语言和WINDOWS下的C语言只是函数库的区别吗?
  • c语言问题:
  • 妙论C语言
  • c语言一疑
  • 关于C语言

关键词

  • 函数
  • 编译器
  • api
  • 显存
  • 汇编
  • 语言
  • vc
  • 图形
  • 内存
  • ws

得分解答快速导航

  • 帖主:frost109

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo