热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

wxErlang在screen绘图以及在window(wxTextCtrl)中用双缓冲绘图示例

-module(text_ctrl_draw).-behaviour(wx_object).-export([new0,start1,destroy0]).-export([in
-module(text_ctrl_draw).

-behaviour(wx_object).

-export([new/0, start/1, destroy/0]).
-export([init/1, 
         terminate/2,  
         code_change/3,
         handle_info/2, 
         handle_call/3, 
         handle_cast/2, 
         handle_event/2]).

-include_lib("wx/include/wx.hrl").
-define(APPEND, 1).
-define(DRAW, 2).
-define(CLEAR, 3).
-record(state,
  {
      frame,
      parent,
      text_ctrl
   }).
%%%===================================================================
%%% API
%%%===================================================================
%%--------------------------------------------------------------------
%% @doc
%% @spec
%% @end
%%--------------------------------------------------------------------
new() ->
    _WX = wx:new(),
    Size = {size, {400, 600}},
    Pos = {pos, {200, 300}},
    Style = {style, ?wxDEFAULT_FRAME_STYLE},
    NOptiOns= [Pos, Size, Style],
    Frame = makeFrame("wxTextCtrl Text", NOptions),
    new([{parent, Frame}]).

new(Config) ->
    start(Config).

start(Config) ->
    wx_object:start_link({local, ?MODULE}, ?MODULE, Config, []).

%%--------------------------------------------------------------------
%% @doc
%% @spec
%% @end
%% wxclient_position_select:destroy()
%%--------------------------------------------------------------------
destroy() ->
    wx_object:call(?MODULE, destroy).

show() ->
    wx_object:call(?MODULE, show).

init(Config) ->
    wx:batch(fun() -> do_init(Config) end).

handle_info(Info, State) ->
    io:format("Got Info ~p\n",[Info]),
    {noreply, State}.

handle_call(destroy, _From, #state{parent = Panel} = State) ->
    wxPanel:destroy(Panel),
    {stop, normal, ok, State};

handle_call(show, _From, #state{frame = Frame} = State) ->
    wxWindow:center(Frame),
    wxFrame:show(Frame),
    {reply, ok,  State};

handle_call(CallMsg, _From, State) ->
    io:format("Got Call ~p\n",[CallMsg]),
    {reply, ok, State}.

handle_cast(CastMsg, State) ->
    io:format("Got cast ~p~n",[CastMsg]),
    {noreply,State}.

code_change(_,  _, State) ->
    {stop, ignore, State}.

terminate(_Reason, _State) ->
    ok.

handle_event(#wx{id = ?APPEND}, #state{parent = Tab,text_ctrl = TextCrl} = State) ->
    wxTextCtrl:hide(TextCrl),
   {TabSizeX, TabSizeY} = wxWindow:getVirtualSize(Tab),
    {OriSX , OriSY} = wxWindow:getScreenPosition(Tab),
    GridHeight = trunc((TabSizeY - 40) / 3),
    BottomPriceLine = OriSY + GridHeight * 2 + 20,%%2500
    EachPriceOccupy = GridHeight * 2 / (37000 - 34000),
    io:format("OriSY = ~p, EachPriceOccupy = ~p~n", [OriSY, EachPriceOccupy]),
    io:format("BottomPriceLine = ~p~n", [BottomPriceLine]),
    CDC = wxScreenDC:new(),
    % CDC = wxClientDC:new(Tab),
    % CDC = wxWindowDC:new(Tab),
    wxDC:setPen(CDC, wxPen:new(?wxLIGHT_GREY, [{width, 1}])),
    wxDC:drawLine(CDC, {OriSX + 0, OriSY + 20}, {OriSX + TabSizeX, OriSY + 20}),
    wxDC:drawLine(CDC, {OriSX + 0, OriSY + GridHeight * 2 + 20}, 
                        {OriSX + TabSizeX, OriSY + GridHeight * 2 + 20}),
    wxDC:drawLine(CDC, {OriSX + 0, OriSY + TabSizeY - 20}, 
                        {OriSX + TabSizeX, OriSY + TabSizeY -  20}),
    wxDC:drawLine(CDC, {OriSX + 50, OriSY + TabSizeY - 20 }, {OriSX + 50, OriSY + 20}),
    wxDC:drawLine(CDC, {OriSX + 750, OriSY + TabSizeY - 20}, {OriSX + 750, OriSY + 20}),
    wxDC:drawLine(CDC, {OriSX + 800, OriSY + TabSizeY }, {OriSX + 800, OriSY }),
    wxDC:setTextForeground(CDC, ?wxGREEN),
    wxDC:setTextBackground(CDC, ?wxBLUE),
    wxDC:drawText(CDC, "if1501
 
 
  
  time", {OriSX, OriSY}),
    wxDC:drawText(CDC, "分时走势", {OriSX + 50, OriSY + 40}),
    % wxDC:setTextForeground(CDC, ?wxYELLOW),
    wxDC:setTextForeground(CDC, ?wxBLUE),
    BottomVolumnLine =  OriSY + TabSizeY - 20,
    wxDC:drawText(CDC, "if1501", {OriSX + 50, BottomPriceLine}),
    wxScreenDC:destroy(CDC),
    % wxClientDC:destroy(CDC).%% showed a little down!!!
    % wxWindowDC:destroy(CDC),
    {noreply, State};

% 用双缓冲在窗口中绘图过程
handle_event(#wx{id = ?DRAW}, #state{text_ctrl = TextCrl, frame = Parent} = State) ->
    CDC = wxClientDC:new(TextCrl),
    BDC = wxBufferedDC:new(CDC),
    wxBufferedDC:init(BDC, BDC),
    wxDC:setBackground(BDC, ?wxBLACK_BRUSH),
    wxDC:clear(BDC),
    %%%%------------
    % 绘图过程,只是示例,自己可以做更复杂些
    wxDC:setTextForeground(BDC, ?wxBLUE),
    wxDC:drawText(BDC, "TTTTTTT", {25, 25}),
    %%%%------------
    % 把绘制好的图复制过去,可以根据需求复制图片的面积以及接受绘图结果的面积
    % eg (1)
    wxDC:blit(CDC, {10 + 5, 10 + 5}, {50, 50}, BDC, {0, 0}),
    % eg(2)
    % {TabSizeX, TabSizeY} = wxWindow:getVirtualSize(TextCrl),
    % wxDC:blit(CDC, {0, 0}, {TabSizeX, TabSizeY}, BDC, {0, 0}),
    wxBufferedDC:destroy(BDC),
    wxClientDC:destroy(CDC),   
    {noreply, State};

handle_event(#wx{},  State) ->
    {noreply, State}.

%%-------------------------
%%%===================================================================
%%% API
%%%===================================================================
do_init(Config) ->
    %% define parent Panel
    Parent = proplists:get_value(parent, Config),
    Panel = wxPanel:new(Parent, []),  
    % define controls ?
    AccountInput   = wxTextCtrl:new(Panel, 11, [{value, ""}, {size, {380, 400}}, 
                                    {style, ?wxTE_LEFT  bor ?wxTE_MULTILINE bor ?wxTE_CAPITALIZE }]),
    Append = wxButton:new(Panel, ?APPEND, [{label, "屏幕绘图"}]),
    Draw = wxButton:new(Panel, ?DRAW, [{label, "双缓冲绘图"}]),
    %% organization
    %% Canvas = wxPanel:new(Panel, [{style, ?wxFULL_REPAINT_ON_RESIZE}]),
    MainSizer = wxBoxSizer:new(?wxVERTICAL),
    wxSizer:add(MainSizer, AccountInput),
    wxSizer:add(MainSizer, Append),
    wxSizer:add(MainSizer, Draw),
    wxPanel:setSizer(Panel, MainSizer),
    wxWindow:center(Parent),
    wxTextCtrl:setFocus(AccountInput),
    wxTextCtrl:setInsertionPoint(AccountInput, 1),
    wxFrame:show(Parent),
    % wxFrame:setBackgroundColour(Parent, ?wxBLUE),
    wxButton:connect(Append, command_button_clicked),
    wxButton:connect(Draw,   command_button_clicked),
    wxTextCtrl:connect(AccountInput, command_text_updated),
    {Panel, #state{frame = Parent, parent = Panel, 
                   text_ctrl = AccountInput}}.

makeFrame(Title, Options) ->
    Frame = wxFrame:new(wx:null(), ?wxID_ANY, Title, Options),
    MenuSet  = wxMenu:new(),
    MenuBar = wxMenuBar:new(),
    wxMenuBar:append(MenuBar, MenuSet, "Setting"),
    wxFrame:setMenuBar(Frame, MenuBar),
    wxFrame:createStatusBar(Frame),
    wxFrame:setStatusText(Frame,"deal wxTextCtrl wxDC"),
    Frame.

 
 

推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 解决java.lang.IllegalStateException: ApplicationEventMulticaster not initialized错误的方法和原因
    本文介绍了解决java.lang.IllegalStateException: ApplicationEventMulticaster not initialized错误的方法和原因。其中包括修改包名、解决service name重复、处理jar包冲突和添加maven依赖等解决方案。同时推荐了一个人工智能学习网站,该网站内容通俗易懂,风趣幽默,值得一看。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
author-avatar
手机用户2502906401
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有