Author Topic: Miscellaneous snippets  (Read 28796 times)

jj2007

  • Moderator
  • Member
  • *****
  • Posts: 10258
  • Assembler is fun ;-)
    • MasmBasic
Working with maps
« Reply #135 on: December 14, 2019, 01:48:12 PM »
Also seen map drawing,why don't add a Fun quiz to geography and country stats on different things?

Yes, that could be fun. Prepare a file with questions and answers, and we'll add it to the attached template (which requires Europe.zip from the MB extras).

Here is the source (attached, with exe):

include \masm32\MasmBasic\Res\MbGui.asm
  GuiControl MyMap, "canvas", w660      ; define a canvas control using 66% of the client rect width
  GuiControl TheManual, "richedit", res:92, x660, w340, bcol RgbCol(255, 255, 240)
  GuiControl Sbar, "statusbar"
  ArrayLoadMap 0, 90                    ; Europe.dmi and Europe.map in resources
  MapColours(0, "abcdefghiabcdefghiabcdefghiabcdefghiabcdefghiabcdefghi")      ; set colours to map 0 (a=red, i=green)
Event CanvasPaint
  ArrayPlot RgbCol(0, 240, 255)         ; init and set background colour
  PaintMap RgbCol(127, 127, 127), lines=2       ; map with grey borders 2px thick
  GuiTextBox 99.0-120, 51.0, 120, auto, "This program requires the file Europe.map", bcol LiteGreen, font -16:FW_NORMAL
  ArrayPlot exit, "Europe"
Event Message
  .if uMsg_==WM_MAPCLICKED
        .if MapRegion>=0
                SetWin$ hSbar="You clicked on "+MapRegion$      ; *** add your ideas here ***
        .else
                SetWin$ hSbar=Time$     ; user clicked into water ;-)
        .endif
  .endif
GuiEnd

LiaoMi

  • Member
  • ****
  • Posts: 675
Re: Working with maps
« Reply #136 on: December 14, 2019, 10:34:20 PM »
Also seen map drawing,why don't add a Fun quiz to geography and country stats on different things?

Yes, that could be fun. Prepare a file with questions and answers, and we'll add it to the attached template (which requires Europe.zip from the MB extras).

Here is the source (attached, with exe):

include \masm32\MasmBasic\Res\MbGui.asm
  GuiControl MyMap, "canvas", w660      ; define a canvas control using 66% of the client rect width
  GuiControl TheManual, "richedit", res:92, x660, w340, bcol RgbCol(255, 255, 240)
  GuiControl Sbar, "statusbar"
  ArrayLoadMap 0, 90                    ; Europe.dmi and Europe.map in resources
  MapColours(0, "abcdefghiabcdefghiabcdefghiabcdefghiabcdefghiabcdefghi")      ; set colours to map 0 (a=red, i=green)
Event CanvasPaint
  ArrayPlot RgbCol(0, 240, 255)         ; init and set background colour
  PaintMap RgbCol(127, 127, 127), lines=2       ; map with grey borders 2px thick
  GuiTextBox 99.0-120, 51.0, 120, auto, "This program requires the file Europe.map", bcol LiteGreen, font -16:FW_NORMAL
  ArrayPlot exit, "Europe"
Event Message
  .if uMsg_==WM_MAPCLICKED
        .if MapRegion>=0
                SetWin$ hSbar="You clicked on "+MapRegion$      ; *** add your ideas here ***
        .else
                SetWin$ hSbar=Time$     ; user clicked into water ;-)
        .endif
  .endif
GuiEnd


If you reduce the window, then everything is well rendered, but if you enlarge the window on the left side, especially in large sections, you can see an unusual drawing line from the text container.

daydreamer

  • Member
  • *****
  • Posts: 1215
  • I also want a stargate
Re: Miscellaneous snippets
« Reply #137 on: December 15, 2019, 04:29:50 AM »
is there a nice site to get updated country facts and figures with help of recall?to fill a country array of struct with different categorys
and create quiz similar to this:
Code: [Select]
http://masm32.com/board/index.php?topic=7834.15
Quote from Flashdance
Nick  :  When you give up your dream, you die
*wears a flameproof asbestos suit*
Gone serverside programming p:  :D
I love assembly,because its legal to write
princess:lea eax,luke
:)

jj2007

  • Moderator
  • Member
  • *****
  • Posts: 10258
  • Assembler is fun ;-)
    • MasmBasic
Re: Working with maps
« Reply #138 on: December 15, 2019, 05:13:59 AM »
If you reduce the window, then everything is well rendered, but if you enlarge the window on the left side, especially in large sections, you can see an unusual drawing line from the text container.

No such line here :rolleyes:

Does anybody else see a line in the wrong place? Which OS?

LiaoMi

  • Member
  • ****
  • Posts: 675
Re: Working with maps
« Reply #139 on: December 15, 2019, 07:42:31 AM »
the picture jumps here and there, photo report can be downloaded here https://www.upload.ee/files/10847594/jj2.zip.html

jj2007: Thanks, now I see what you mean: the delay when updating the richedit control. There is a simple explanation for this effect: it can't be done fast enough. Even when sizing the window slowly, cpu usage goes up to 100% for the core of the process. The map is about 18k lines to draw - and this is not done via StretchBlt, it really gets completely drawn for each frame. Watch the Norwegian coastline when sizing the main window very slowly.

In theory, I could switch to StretchBlt, but 1. sizing the window frenetically is not a typical usage and 2. painting a single country to achieve the feedback effect when you click into the country would require more sophisticated code and logic.

P.S.: I just realised that instead of quoting your post, I modified it, and also deleted most of it - sorry. These are the pros and cons of being the administrator of a sub-forum :cool:
« Last Edit: December 15, 2019, 10:07:48 PM by LiaoMi »

LiaoMi

  • Member
  • ****
  • Posts: 675
Re: Miscellaneous snippets
« Reply #140 on: December 15, 2019, 10:08:09 PM »
Changing the DC a Control paints on
Hello,

Is it possible to make a control (a richedit control for example) paint onto your own DC instead of the window DC?

http://www.asmcommunity.net/forums/topic/?id=15998

WS_EX_COMPOSITED
0x02000000L
Paints all descendants of a window in bottom-to-top painting order using double-buffering. Bottom-to-top painting order allows a descendent window to have translucency (alpha) and transparency (color-key) effects, but only if the descendent window also has the WS_EX_TRANSPARENT bit set. Double-buffering allows the window and its descendents to be painted without flicker. This cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.
Windows 2000: This style is not supported.

As an option ..
Code: [Select]
myRichCtrl.ShowWindow(SW_HIDE);
myRichCtrl.DoSomething();
myRichCtrl.ShowWindow(SW_SHOW);

jj2007

  • Moderator
  • Member
  • *****
  • Posts: 10258
  • Assembler is fun ;-)
    • MasmBasic
Re: Miscellaneous snippets
« Reply #141 on: December 16, 2019, 11:34:41 AM »
WS_EX_COMPOSITED

Looks interesting, thanks :thumbsup:

But when I add this style to an edit or richedit control, CreateWindowEx fails. Raymond Chen writes about another issue, though.

Attached another one from the life expectancy series, now comparing two countries. The red line gets chosen with the left and right arrows, the blue one by clicking into the map. Source included.

Biterider

  • Member
  • ****
  • Posts: 511
  • ObjAsm Developer
    • ObjAsm
Re: Miscellaneous snippets
« Reply #142 on: December 16, 2019, 05:37:45 PM »
Hi
I used the WS_EX_COMPOSITED style for my own controls and it works fine if you follow the MS rules.
One problem I noticed is that the scrollbar loses the scrollbox transition effects.
It's a trifle if you get rid of the awful flicker.

Biterider
« Last Edit: December 16, 2019, 11:33:31 PM by Biterider »

LiaoMi

  • Member
  • ****
  • Posts: 675
Re: Miscellaneous snippets
« Reply #143 on: December 16, 2019, 11:22:04 PM »
Hi

I used the WS_EX_COMPOSITED style for my own controls and it works fine if you follow the MS rules.
One problem I noticed is that the scrollbar loses the scrollbox transition effects.
It's a trifle if you get rid of the awful flicker.[/size]

Biterider

Hi Biterider,

 :biggrin: Is the font specially size=2px small? Yes  :thumbsup:, following the recommendations of Microsoft, it should work.

Biterider

  • Member
  • ****
  • Posts: 511
  • ObjAsm Developer
    • ObjAsm
Re: Miscellaneous snippets
« Reply #144 on: December 17, 2019, 12:09:53 AM »
Hi LiaoMi
Sorry, better now?  :biggrin:


jj2007

  • Moderator
  • Member
  • *****
  • Posts: 10258
  • Assembler is fun ;-)
    • MasmBasic
Re: Miscellaneous snippets
« Reply #145 on: December 17, 2019, 01:13:45 AM »
It should work, yes, but...

Code: [Select]
push 0                     ; ÚlParam = NULL
push dword ptr [40FA34]    ; ³hInst = 00400000
push 2A                    ; ³ID = 42.
push dword ptr [ebp+8]     ; ³hParent
push 28                    ; ³Height = 40.
push 5A                    ; ³Width = 90.
push 0A                    ; ³Y = 10.
push 0A                    ; ³X = 10.
push 54A41144              ; ³Style = WS_CHILD|WS_BORDER|WS_THICKFRAME|WS_VISIBLE|WS_CLIPSIBLINGS|WS_VSCROLL|1144
push 0                     ; ³WindowName = NULL
push offset 004101DE       ; ³ClassName = "RichEdit20W"
push 2000020               ; ³ExtStyle = WS_EX_TRANSPARENT|2000000
call <jmp.&user32.CreateWi ; ÀUSER32.CreateWindowExW

Now that I applied WS_EX_COMPOSITED to the parent window,
1. the control gets created using WS_EX_COMPOSITED = 2000000h
2. but WinID shows exstyle 0x120 for the child (and 2000100 for the parent)
3. and the flicker is as before

It certainly looks nice when dragging the edit over the map :tongue:
 :sad:

jj2007

  • Moderator
  • Member
  • *****
  • Posts: 10258
  • Assembler is fun ;-)
    • MasmBasic
Mirrored squares
« Reply #146 on: December 17, 2019, 08:27:58 PM »
There are many numbers with matching "mirrored squares", like 13^2=169, 31^2=961:

Code: [Select]
matches number  mirror  square  mirror
1       11      11      121     121
2       12      21      144     441
3       13      31      169     961
4       21      12      441     144
5       22      22      484     484
6       31      13      961     169
100 numbers tested, 5.9% matches

include \masm32\MasmBasic\MasmBasic.inc         ; download
  SetGlobals matches
  Init
  For_ ct=1 To 100000000                ; 100 million iterations
        Let esi=Str$(ct)                ; e.g. "13"
        void Val(esi)                   ; 13
        mul eax                         ; 169
        push Mirror$(Str$(eax))         ; "961"
        void Val(Mirror$(esi))          ; 31
        mul eax                         ; 961
        xchg Str$(eax), edi             ; edi: "961"
        pop ecx                         ; "961"
       .if !StringsDiffer(ecx, edi)     ; "961"=="961"
                inc matches
                PrintLine Str$(matches), Tb$, esi, Tb$, Mirror$(esi), Str$("\t%i\t", ct*ct), edi
        .endif
  Next
  Inkey Str$("%i numbers tested", ct-1), Str$(", %5f% matches", matches/ct*100)
EndOfCode

daydreamer

  • Member
  • *****
  • Posts: 1215
  • I also want a stargate
Re: Working with maps
« Reply #147 on: December 18, 2019, 07:16:30 AM »
Also seen map drawing,why don't add a Fun quiz to geography and country stats on different things?

Yes, that could be fun. Prepare a file with questions and answers, and we'll add it to the attached template (which requires Europe.zip from the MB extras).

so far something to test with
Quote from Flashdance
Nick  :  When you give up your dream, you die
*wears a flameproof asbestos suit*
Gone serverside programming p:  :D
I love assembly,because its legal to write
princess:lea eax,luke
:)

LiaoMi

  • Member
  • ****
  • Posts: 675
Re: Miscellaneous snippets
« Reply #148 on: December 18, 2019, 07:23:19 AM »
It should work, yes, but...

Code: [Select]
push 0                     ; ÚlParam = NULL
push dword ptr [40FA34]    ; ³hInst = 00400000
push 2A                    ; ³ID = 42.
push dword ptr [ebp+8]     ; ³hParent
push 28                    ; ³Height = 40.
push 5A                    ; ³Width = 90.
push 0A                    ; ³Y = 10.
push 0A                    ; ³X = 10.
push 54A41144              ; ³Style = WS_CHILD|WS_BORDER|WS_THICKFRAME|WS_VISIBLE|WS_CLIPSIBLINGS|WS_VSCROLL|1144
push 0                     ; ³WindowName = NULL
push offset 004101DE       ; ³ClassName = "RichEdit20W"
push 2000020               ; ³ExtStyle = WS_EX_TRANSPARENT|2000000
call <jmp.&user32.CreateWi ; ÀUSER32.CreateWindowExW

Now that I applied WS_EX_COMPOSITED to the parent window,
1. the control gets created using WS_EX_COMPOSITED = 2000000h
2. but WinID shows exstyle 0x120 for the child (and 2000100 for the parent)
3. and the flicker is as before

It certainly looks nice when dragging the edit over the map :tongue:
 :sad:

Hi jj2007,

 :sad: everything looks softer, but flicker is noticeable, frame-by-frame recording shows that the frame rate has increased, its not a solution.

jj2007

  • Moderator
  • Member
  • *****
  • Posts: 10258
  • Assembler is fun ;-)
    • MasmBasic
Re: Miscellaneous snippets
« Reply #149 on: December 18, 2019, 10:00:04 AM »
:sad: everything looks softer, but flicker is noticeable, frame-by-frame recording shows that the frame rate has increased, its not a solution.

I can't see much difference, but in any case there is no solution because the map drawing is so slow that flicker on resize cannot be avoided.