为了账号安全,请及时绑定邮箱和手机立即绑定

下边这个程序哪里错了呀~~运行时画不出图来!!

下边这个程序哪里错了呀~~运行时画不出图来!!

郎朗坤 2022-10-26 19:15:03
#include<ncurses.h>int main(){initscr();WINDOW *win;win=newwin(11,11,'|','-');getch();endwin();}错了~~~程序应该是这样~~#include<ncurses.h>int main(){initscr();WINDOW *win;win=newwin(11,11,1,1);box(win,'|','-');getch();endwin();}这样运行的时候也不画图~~~
查看完整描述

2 回答

?
森栏

TA贡献1810条经验 获得超5个赞

理解怎么样用API来编程.你应该能熟练的运用API来编程.你就会少很多的困惑.亲手写一个API的窗口程序吧!
别的不罗嗦了,现在给你解释一下:
资源:这个名字已经很清楚了,就是材料,是构建你想要的"窗口"的材料.(当然不只是窗口,还有光标,BIM图...)就象你要造一个"红色的门",那些木头,红漆呀就是资源.当然,在MFC中,MFC已经给我们造好一个"门",只是这个门没有颜色(或者就默认的颜色),你要做的就是把这个"门"拿来(这里的门,也是你的资源),你自己可以刷上红漆,就是你想要的"红门"了.如果你不想要MFC帮你做的门,你可以自己用一些最基本的资源来做这个门了.

消息:学WINDOWS编程,你应该知道,WINDOWS是消息驱动的.就是说,在他的WinMain函数中,在建立窗口时,会有一个窗口处理函数,在这个窗口处理函数中会有一个消息处理函数,这个消息处理函数是一直在循环的.在循环体内用switch语句来处理不同的消息.形式就如同:
while(1)
{
switch(nMsg)
{
case WM_LBUTTONDOWN:
{
//处理动作....
}
break;
case WM_RBUTTONDOWN:
break;
case WM_USER+1:
break;
case WM_USER+2:
break;
default;
}
}
消息,其实就是你定义的一个"事件"的参数(当然你也可以自己定义).通过2个函数投递到应用程序的消息队列中.(SendMessage和PostMessage.)

消息响应函数:很明显了,就是用来响应消息的函数.这里牵涉到一个"消息映射"的概念,在MFC中,你可以看到ON_MESSAGE(...)这样的形式,就是将消息和对应的处理函数联系起来,当一有这样的消息产生,就会用这个处理函数来处理.
消息处理函数:这个和消息响应函数是一回事.



查看完整回答
反对 回复 2022-11-01
?
元芳怎么了

TA贡献1798条经验 获得超7个赞

我用的不是Linux 所以不太清楚,但应该是newwin()里面的参数有问题
resource ncurses_newwin ( int $rows , int $cols , int $y , int $x )
rows 是长度 , cols 是宽度,y是窗口起点的y坐标,x是窗口起点的x坐标,应该都是int类型~
我看别人都是这么写的 win = newwin(15, 50, 1, 1);
-------------------------------------------上次回答的分割线---------------------------------------------
PS: 这个是我找到的资料 应该是你所说的问题
我觉得是你在box后少了一句话 wrefresh(win);我这边没法编译所以你自己看着学了~~
/////////////////////////////////////////////////////////////////////
一个窗口的建立是通过一个叫做newwin()的函数开始的。别以为你使用这个函数后会立即在屏幕上出现一个窗口。这个函数的作用是分配内存给窗口相关的数据结构。因此在CURSES里,窗口是一个假想的抽象概念。可以在屏幕中对这个假想中的窗口各个部分进行独立的控制。newwin()函数返回一个指向窗口的结构指针。这个指针可以被传送至一些类似于wprintw()这样需要窗口参数的函数中。使用delwin()函数可以删除一个窗口,并且释放存储窗口数据结构的内存和信息。

我要看见它!

有意思的是,我们创建了一个窗口却无法看见它。所以我们要做的是如何将窗口显示出来。box()函数可以用来在已经定义的窗口外围画上边框。让我们从以下这个例子中探索一下这些函数的详细信息。

例:带边框的窗口:

#include <ncurses.h>

WINDOW *create_newwin(int height, int width, int starty, int startx);
void destroy_win(WINDOW *local_win);

int main(int argc, char *argv[])
{ WINDOW *my_win;
int startx, starty, width, height;
int ch;

initscr(); /* 初始化并进入curses模式 */
cbreak(); /* 行缓冲禁止,传递所有控制信息 */
keypad(stdscr, TRUE); /* 程序需要使用F1功能键 */

height = 3;
width = 10;
starty = (LINES - height) / 2; /*计算窗口中心位置的行数 */
startx = (COLS - width) / 2; /*计算窗口中心位置的列数 */
printw("Press F1 to exit");
refresh();
my_win = create_newwin(height, width, starty, startx);

while((ch = getch()) != KEY_F(1))
{ switch(ch)
{ case KEY_LEFT:
destroy_win(my_win);
my_win = create_newwin(height, width, starty,--startx);
break;
case KEY_RIGHT:
destroy_win(my_win);
my_win = create_newwin(height, width, starty,++startx);
break;
case KEY_UP:
destroy_win(my_win);
my_win = create_newwin(height, width, --starty,startx);
break;
case KEY_DOWN:
destroy_win(my_win);
my_win = create_newwin(height, width, ++starty,startx);
break;
}
}

endwin(); /*结束 curses模式 */
return 0;
}

WINDOW *create_newwin(int height, int width, int starty, int startx)
{
WINDOW *local_win;
local_win = newwin(height, width, starty, startx);
box(local_win, 0 , 0); /* 0, 0是字符默认的行列起始位置 */
wrefresh(local_win); /*刷新窗口缓冲,显示 box */
return local_win;
}

void destroy_win(WINDOW *local_win)
{/
* box(local_win, ' ', ' ');不会按照预期的那样清除窗口边框。 而是在窗口的四个角落留下残余字符*/
wborder(local_win, ' ', ' ', ' ',' ',' ',' ',' ',' ');
/*参数注解:
* 1. win:当前操作的窗口
* 2. ls:用于显示窗口左边界的字符
* 3. rs:用于显示窗口右边界的字符
* 4. ts:用于显示窗口上边界的字符
* 5. bs:用于显示窗口下边界的字符
* 6. tl:用于显示窗口左上角的字符
* 7. tr:用于显示窗口右上角的字符
* 8. bl:用于显示窗口左下角的字符
* 9. br:用于显示窗口右下角的字符
*/
wrefresh(local_win);
delwin(local_win);
}


查看完整回答
反对 回复 2022-11-01
  • 2 回答
  • 0 关注
  • 114 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信