Я пытаюсь работать с DrawingAreas, и все работает не так, как я ожидал.
#include <Xm/Xm.h>
#include <Xm/DrawingA.h>
main(int argc, char *argv[])
{
Widget shell, workArea, box1;
XtAppContext app;
shell = XtVaAppInitialize(&app, "gp", NULL, 0, &argc, argv, NULL, XmNwidth, 500, XmNheight, 500, NULL);
XtRealizeWidget(shell);
workArea = XtCreateWidget("wa",xmDrawingAreaWidgetClass, shell, NULL, 0);
XtVaSetValues(workArea, XmNbackground, 30000, NULL);
box1 = XtCreateWidget("b1", xmDrawingAreaWidgetClass, workArea, NULL, 0);
XtVaSetValues(box1, XmNx, 0, XmNy, 0, XmNwidth, 400, XmNheight, 400, NULL);
XtManageChild(workArea);
XtManageChild(box1);
//XtAppMainLoop(app);
XEvent event;
Dimension x,y,w,h;
while(1)
{
XtAppNextEvent(app, &event);
if (event.type == EnterNotify)
{
XtVaGetValues(box1, XmNx, &x, XmNy, &y, XmNwidth, &w, XmNheight, &h, NULL);
printf("(x,y,w,h) == (%d,%d,%d,%d)\n", x, y, w, h);
}
if (event.type == LeaveNotify)
{
XtVaSetValues(box1, XmNx, 0, XmNy, 0, XmNwidth, 400, XmNheight, 400, NULL);
printf("tried to set (x,y,w,h) = (0,0,400,400)\n");
}
XtDispatchEvent(&event);
}
}
Когда я вхожу в окно и покидаю окно с указателем, я получаю вывод:
(x,y,w,h) == (10,10,400,400)
(x,y,w,h) == (10,10,400,400)
tried to set (x,y,w,h) = (0,0,400,400)
tried to set (x,y,w,h) = (0,0,400,400)
(x,y,w,h) == (10,10,400,400)
(x,y,w,h) == (10,10,400,400)
tried to set (x,y,w,h) = (0,0,400,400)
tried to set (x,y,w,h) = (0,0,400,400)
Почему XtVaSetValues не устанавливает box1 в (X, Y) = (0,0)? Как выполнить размещение области рисования в точке (0,0) в окне?
Я разобрался с ответом, но не имею репутации, чтобы обеспечить его:
XtManageChild(box1);
XtUnmanageChild(box1);
XtVaSetValues(box1, XmNx, 0, XmNy, 0, XmNwidth, 400, XmNheight, 400, NULL);
XtMapWidget(box1);
Похоже, что вызов XtManageChild () вызывает родительскую процедуру change_managed:
xtmanpage
Чтобы установить (x, y) в (0,0), я должен убедиться, что виджет не управляется:
XtManageChild(box1); // must be called once
XtUnmanageChild(box1); // unmanage to allow (0,0)
XtVaSetValues(box1, NmNx, 0, XmNy, 0, XmNwidth, 400, XmNheight, 400, NULL);
XtMapWidget(box1); // show the widget
Других решений пока нет …