-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, "if1501time", {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.