PolyML/Motif: как одновременно нарисовать окно, содержащее кнопку XmLabelPixmap?

В PolyML я пытаюсь нарисовать кнопку с растровым изображением внутри, но не могу найти способ создать растровое изображение перед вызовом XtRealizeWidget в виджете оболочки.

Использование XCreateBitmapFromData после XtRealizeWidget приводит к огромной задержке отрисовки кнопки с изображением внутри, что действительно глупо. Это код ниже.

соответствующие строки:

val   shell = XtAppInitialise "" "appl" "clss" [] [XmNwidth 500, XmNheight 500 ] ;
val   mainw = XmCreateMainWindow shell "window" [] ;
val   instruct = XmCreateDrawnButton mainw "button" [XmNwidth 60, XmNheight 30 , XmNlabelType XmPIXMAP,  XmNmappedWhenManaged true ];
val x =XtManageChildren [ instruct ] ;
val x=XtManageChild mainw ;

XtRealizeWidget shell;
let
 val thePic = XCreateBitmapFromData (XGetWindowRoot (XtWindow instruct)) (MakeData thePiclist)  (Area{x=0,y=0,w=25,h=25}) 
in
 XtSetValues instruct [XmNlabelPixmap thePic] 
end ;

Я думаю, что я должен сделать, чтобы все окно, включая изображение, отображалось одновременно, это вызвать XtSetValues ​​перед XtRealizeWidget, . Я не смог сделать эту работу. Вызов XGetWindowRoot или любой аналогичный вызов не работает. Ошибки похожи на: X Error BadDrawable в XGetGeometry

Может ли кто-нибудь сказать мне, как создать окно с кнопкой с растровым изображением таким образом, чтобы все рисовалось одновременно?

оставшийся код:

open XWindows ;
open Motif ;

val thePiclist= [
   0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
   0x7c, 0x00, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00,
   0xfc, 0x1f, 0x00, 0x00, 0xfc, 0x7f, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00,
   0xfc, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x1f, 0x00, 0xfc, 0xff, 0x7f, 0x00,
   0xfc, 0xff, 0xff, 0x00, 0xfc, 0xff, 0x7f, 0x00, 0xfc, 0xff, 0x1f, 0x00,
   0xfc, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0x7f, 0x00, 0x00,
   0xfc, 0x1f, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x00,
   0x7c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00];


fun MakeData []     = ""
 |   MakeData (H::T) = (str (chr H)) ^ (MakeData T) ;

person thomasnnam123    schedule 24.08.2015    source источник


Ответы (1)


Пытаться

  Display *dpy = XtDisplay(shell);
  XCreateBitmapFromData( dpy, DefaultRootWindow(dpy), ... );
person FredK    schedule 24.08.2015
comment
Спасибо. Это было [br/] [код] val rw = RootWindow (оболочка XtDisplay) ; val P = XCreateBitmapFromData rw (MakeData thePiclist) ... ; val res=XtSetValues ​​инструктирует [XmNlabelPixmap P] ;[/code][br/], что можно сделать до реализации оболочки Widget. Это работает отлично. [br/] Похоже, функция XtDisplay отсутствует в справочниках по PolyML. - person thomasnnam123; 24.08.2015