引用自:
file: x11_test.cxx
#include
每乙個xlib 程式都必須包含這個標頭檔案
#include
1. int main(void) ;
15.xnextevent(display, &event);
16. }
接下來就是進入事件迴圈了。獲得事件,處理或丟棄。上面講到,呼叫xmapwindow
函式後,x server
會發出乙個mapnotify
事件給客戶端,這時客戶端就已經有相應操作了,就是畫視窗,所以事件迴圈裡並沒有寫出來。
17. return 0;
18. }
至此,整個程式結束。
編譯:g++ -lx11 -o x11_test x11_test.cxx
執行,螢幕上就顯示乙個最簡單的視窗了。
如果我們想看看mapnotify
事件到底是怎麼回事,就這樣寫:
while(1)
//sleep(3);
return 0;
執行發現,視窗一閃而過。也就是說,客戶端一接收到這個事件就顯示視窗,一顯示視窗就break
了。把注釋拿掉,則顯示視窗3
秒鐘後才消失。
這裡看到,接收到的事件由xnextevent
函式從訊息佇列裡獲得,把事件放到event.type
裡並從佇列裡刪除該訊息
。當隊列為空也就是沒有下乙個事件被接收時,xnextevent「flushes the output buffer」,也就是視窗最終被顯示,並且程式就一直停留在xnextevent
裡直到有下乙個事件,除非有跳出迴圈的語句。
繼續改程式:
while(1)
xdrawline(display, win, gc, 10, 160, 180, 20);
//xflush(display);
sleep(3);
return 0;
跳出迴圈後,用xdrawline
畫一條線。這時執行程式,視窗上並沒有出現直線。因為視窗的資訊改變了,就需要xflush
函式來flush
一下,讓視窗重畫。而之前之所以沒有xflush
函式,是因為xnextevent
函式隱式地呼叫xflush
了,而且呼叫後並沒有改變視窗資訊。
繼續改,新增事件:
xselectinput(display, win, exposuremask|keypressmask|structurenotifymask);
while(1)
;
xnextevent(display, &event);
switch(event.type)
case expose:
case keypress:
}
default: break;
}
}
return 0;
事件型別structurenotifymask
對應事件configurenotify
,即改變視窗狀態,比如尺寸,位置等;exposuremask
對應事件expose
(我不知道怎麼解釋這個事件),本例中是在這裡設定視窗顏色,畫字串並設定字串顏色;keypressmask
對應keypress
,即鍵盤響應,本例是當escape
鍵按下時,退出視窗。退出視窗時,需要釋放或者說銷毀gc
,最開始曾開啟display
,在這裡需要關閉和x server
的連線,於是也就銷毀了相關資源,關閉了視窗。
在這種迴圈的寫法中,退出switch
,並沒有退出整個迴圈,xnextevent
仍然在顯示視窗,所以不需要我們自己呼叫xflush
。
有這樣乙個**:
,通俗易懂。
spring進行事務管理
用jdbc的事務管理器 datasourcetransactionmanager 而啟用事務註解中的transaction manager值必須是trasactionmanager,若配置的事務管理器的id為trasactionmanager,nametransaction manager可以不寫 ...
運用chain進行跳轉
struts2裡的result的chain,可以將action串成乙個鏈,從而實現自定義的跳轉,redirect型別的url會變更,chain不會變更,這個是最大的差別,chain裡的值棧物件會被自動壓入新的action裡。看 struct.xml aaction baction a.jsp b.j...
Spring 使用註解方式進行事物管理
spring 使用註解方式進行事物管理 當標於類前時,標示類中所有方法都進行事物處理 例子 transactional public class testservicebean implements testservice 當類中某些方法不需要事物時 transactional public cla...