There are a lot of clock area today screen apps out there, from the simple such as PDClock, through mid-level stuff like HTC home, up to the fully customizable rlToday.
Few of these seem to be a good all-round solution though, except maybe rlToday, but I am having issues with the rlToday / Sys-to-Reg / Mortscript combo, both in terms of features (ie no support for "on" or "off" images), stability, and ease-of install (S2R seems a bugger to set up right, especially for the less technically inclined user), and the whole rlToday / S2R / Mortscript combo is hardly a turnkey one-install solution.
So to that end, I decided to try my hand at crafting a solution more appropriate to my needs.
Now, until this point I have never coded for C++ or windows mobile. I am not even a professional coder, far from it, but I do have a knack for designing good solutions, so I thought I would start teaching myself native C++ and see what I could come up with. Ultimately, my goal is to release as open source, I am hoping to maybe start a sourceforge project at some point...
I am making this post because I am now starting to get past the proof-of-concept stage and am coming up with some working code. I am tackling the various hurdles one by one and learning as I go, but it is starting to look promising.
This thread is to serve two purposes:
1) Gather my thoughts on how things are going to work so potential users can chime in on possible tweaks or changes to the features and how they should work.
2) Serve as a rallying call for any (preferably more experienced) coders who wish to get involved. I will post up any problems that I am having surmounting various issues, please feel free to help out on those. If an experienced coder liked the project that much and wanted to take the lead, I have no issues with that, as long as it remained open source.
So, with that out the way, here is what I am thinking so far:
Overall idea is pretty similar to rlToday - a script (ie a .INI or .XML file) which lists Widgets is processed and the result is drawn on the screen.
For example, here is an example INI file for a background (say transparent) PNG with a clock overlaid in the middle of the PNG, that has different layouts / images for portrait and landscape mode on a qVGA device.
Code:
;ini profile for qVGA (240 width and 320 width)
;PORTRAIT
[PortBG]
width=240
widget=image
clickable=0;
image="bgport.png"
x=0
y=0
[PortClock]
width=240
widget=text
subwidget=clock
clickable=1
clicktype=exe
clickstring="<exe to launch calendar>"
dateformat = "dddd MMMM d"
x=120
y=25
origin="cc"
;LANDSCAPE
[LandBG]
width=320
widget=image
clickable=0
image="bgland.png"
x=0
y=0
[LandClock]
width=320
widget=text
subwidget=clock
clickable=1
clicktype=exe
clickstring="<exe to launch calendar>"
dateformat = "dddd MMMM d"
x=160
y=25
origin="cc"
The [Name] of each section actually does nothing, but it will be useful in debugging / error messages ("Image for [PortBG] not found!").
Widget = choses which kind of widget it is (eg Image, Text)
subwidget = choses the subtype of widget (eg clock is a subtype of text)
The Width= entry is an idea I came up with to handle multiple screen orientations and resolutions within one profile. Basically, as this is not intended to be a full-screen app, the only relevant dimension is the screen width. Each widget therefore has an associated width. When the screen is rendered, it will check what the current width is and only render widgets that match that width. Furthermore, if a script has entries for resolutions not supported by your device, these will be ignored. Profiles are likely to be a directory with one .INI file and assorted images. Images can be in subdirectories, say grouped by width (ie a "240" dir and a "320" dir for qVGA) - that way you could release a skin as one zipped dir that supported all devices and resolutions, and you would not need to upload the "480" and "640" dirs to a qVGA device, thus saving storage space.
Each widget also has x/y coords, which usually refer to the top left, but the origin entry can change that (eg cc would be centre horizontally and vertically)
Each widget will also be able to be specified as clickable, with options as to what to do when it is clicked.
With this system it should be possible to create most things, however, here is what I am currently NOT planning on doing:
I am not aiming at offering tabbed pages of widgets, or an easy way to change widgets without writing a new script. This is aimed at a companion to something like UltimateLaunch for handling the top of the screen - a Clock, SMS / Missed Calls / VM messages, BT / WiFi status and toggles etc.
I am currently using VS2005 and the WM5 SDK, but the app is still so simple that this could probably be changed. I would like to support as much as possible, but am not overly worried about providing backwards compatibility beyond WM5. I am using Native Win32 - I want to avoid as much bloat as I can.
Planned features:
Per-pixel Alpha PNGs - IMPLIMENTED
Widgets parsed from INI - IMPLIMENTED
Parse only items from INI that match screen caps - IMPLIMENTED
Display only items that match current screen width - IMPLIMENTED (Effectively switch profile on screen orientation change)
Options screen to set current profile
Widgets
======
Text Type: - IMPLIMENTED
Source: String in INI - IMPLIMENTED
Source: String in Registry
Source: Date from format string - IMPLIMENTED
Image type: - IMPLIMENTED
Plain image - IMPLIMENTED
Status Image - Registry value
Toggles - BlueTooth / WiFi / Phone etc
Other features
===========
Multiple screen resolutions supported per INI - IMPLIMENTED
Detect Power but no Activesync - Allow enabling of BlueTooth for automatic pairing with in-car BT handsfree.
Current questions and stumbling blocks:
Having issues finding a lightweight way of displaying per-pixel alpha PNGs. Current thinking is that AlphaBlend is perfectly capable of doing the blending, it is just SHLoadImageFile that is stripping the alpha info.
See threads here and here
Not sure how I am going to handle toggling of BT / WiFi. Could use VJ's tool, but I would rather do it in my code. Any pointers on how to do it and maintain maximum WM5 / WM6 compatibility would be appreciated - VJ's tool will not toggle WiFi on my Kaiser anyway...
Could do with decent chop and chomp routines (split by char and remove leading / trailing whitespace) - does anyone know an easy way to do this in native code?
Need to work out how to find the size of a text string in pixels *before* it gets drawn to the screen with ExtTextOut
Need to impliment a date format string to text string converter that can handle date and time objects in the same string
Currently I use a bit of code to look at the string and pass it to either GetDateFormat or GetTimeFormat, but not split the string and pass relevant bits to relevant routine, then reassemble.
Need to make whole thing a today item, but delaying doing this as it seems that debugging will be harder? I also guess this would be quite easy, so I am planning on leaving this until near the end. Any advice on this subject would be appreciated.
I am interested in this. I don't know C++, but I have experience coding with other computer languages. I'll definitely be following this thread and watching for updates.
iContact source contains some pretty lightweight INI library. It isn't written by me, and it's called SimpleIni. Everything is contained in one .h file and it's very easy to use.
good luck,
larna
larna said:
iContact source contains some pretty lightweight INI library. It isn't written by me, and it's called SimpleIni. Everything is contained in one .h file and it's very easy to use.
good luck,
larna
Click to expand...
Click to collapse
Nice one, thanks
I got simpleini in and working - you were right larna, it was really easy and pain-free. Thanks!
Update:
I have a working prototype.
All basic functionality coded - text and image widget types, orientation switching, ini parsing...
Currently still not a today item, and there is loads to do in terms of error checking and freeing up memory etc, but it parses INI files OK
Once I have done some tidying up, I will release some source and maybe a demo EXE.
Hey!!
I'm already developing an application which load and extends rlToday Themes!
sources will be released soon!
The app is XIAMultitheme:
Done:
- fully working rltoday themes on a HWND
- done today plugin
- loading external dll
- all widgets are external dll
To do:
- avoid image loading via ImageFactory due to memory leak on wm6x
- port to CxImage to load PNG
- use AAROT to free rotate images (analog clock)
- today plugin does not load the engine yet
http://www.xiaprojects.com/?section=All&project=XIAMultiTheme
what do you think? mail me on priv (stefano) on xiaprojects.com
stefanux said:
Hey!!
I'm already developing an application which load and extends rlToday Themes!
sources will be released soon!
The app is XIAMultitheme:
Done:
- fully working rltoday themes on a HWND
- done today plugin
- loading external dll
- all widgets are external dll
To do:
- avoid image loading via ImageFactory due to memory leak on wm6x
- port to CxImage to load PNG
- use AAROT to free rotate images (analog clock)
- today plugin does not load the engine yet
http://www.xiaprojects.com/?section=All&project=XIAMultiTheme
what do you think? mail me on priv (stefano) on xiaprojects.com
Click to expand...
Click to collapse
hi stefano
i see nothing on your web site , nor screenshots nothing in download binaries
Why ???
evilc said:
Update:
I have a working prototype.
All basic functionality coded - text and image widget types, orientation switching, ini parsing...
Currently still not a today item, and there is loads to do in terms of error checking and freeing up memory etc, but it parses INI files OK
Once I have done some tidying up, I will release some source and maybe a demo EXE.
Click to expand...
Click to collapse
can you upload here the demo program ?
Sounds pretty neat!
I don't understand some of the terminology you use, but I think you may be talking about a feature I had an idea for:
profiles (XML files) can be associated with a today plugin such that you can make a profile appear in the today plugins list for each skin (XML file) you have installed - thus making each XML profile behave like it was a today plugin in it's own right.
Is that what you are talking about?
brunoisa10 said:
can you upload here the demo program ?
Click to expand...
Click to collapse
Demo uploaded to first post. Unzip it to \Storage Card\shared on your device and run.
BE AWARE, there is very little error checking when parsing the INI.
If you omit a horizres line for any widget, for example, the program will crash.
Well I checked out XIAMultiTheme and it looks promising.
I was not aware that there was a memory leak bug in IImagefactory, I wasn't planning on using it in the final version anyway, so no biggie.
If XIAMultiTheme is capable of doing what I had envisaged for openClock, I will probably stop development, as you obviously know what you are doing much more than I do
However, a couple of points:
1) Size.
XIAMultiTheme seems to be a lot bigger and requires .NET - This seems to mainly be to do with the CxImage library - just PNG support seems to add more size than my entire app is! I am flabberghasted that supporting per-pixel Alpha PNGs takes this much, an alphablend routine can be done in a K or two, hundreds seems overkill. Apart from the requirement for rotation (for analogue clocks) I do not see why a full image lib is needed. Just a load and alpha blit.
2) Orientation awareness.
As in I don't see any in XIAMultiTheme. I am really happy with the way I have handled this in openClock - each item in the INI (XML in your case) has a "horizres" value associated with it. At render time, current screen width is compared to each item's horizres and if it matches, the item is drawn, if it doesn't then it isn't shown.
This provides a nice way to combine portrait, landscape and multi-res capabilities into one theme. And as long as you allow relative paths in the theme(eg 320\320bg.png, 240\240bg.png, common\common.png) then you can have a theme which supports all resolutions and orientations, and allow the user to store what they want on their PPC (eg if their device is qVGA, they know they do not need to put the 640 and 480 dirs on their PPC for a given theme, as they won't be used)
3) Stateful buttons.
Items like a voicemail button / wifi button etc should probably have two images associated with them - one for "no messages", one for "have messages". I was planning on putting something in openClock along the lines of specifying a reg key, an operator and an image.
eg:
regkey=HKEY_LOCAL_MACHINE\...
on=thisimage.png, gt, 0
off=thatimage.png
To set to thisimage if the key is of value greater than (gt) 0 or thatimage.png if not.
Good luck!
evilc said:
just PNG support seems to add more size than my entire app is!
Click to expand...
Click to collapse
Yep. Same goes for MortButtons... (and MortPlayer, but there, the player itself is bigger in relation...)
I am flabberghasted that supporting per-pixel Alpha PNGs takes this much, an alphablend routine can be done in a K or two, hundreds seems overkill.
Click to expand...
Click to collapse
The alphablend routine is in the Draw method, and even in source code not much more than 1kB.
The trouble is to load the PNG without losing the alpha information. With Windows' API, you can't do it - there's only the crippled SHLoadImage. So you need the entire code to decode PNGs, i.e. libpng, which in return requires zlib - over 200kB only to load PNG! The remaining kBs are spend to load/decode JPEG (quite some kBs, too), GIF (if enabled), BMP, ... and some basic image processing (resample, rotate, ...).
btw, you might want to check MortImg.dll and MortImage.lib, which is a (quite) simple wrapper. If only one image library is used, at least some memory on the device is saved (and if MortButtons or MortPlayer since b72 is used, also main memory).
Check out http://mort.svnrepository.com/svn/mort/MortTools/trunk with any SVN client (e.g. Tortoise), use "guest" for login and password.
evilc said:
Well I checked out XIAMultiTheme and it looks promising.
I was not aware that there was a memory leak bug in IImagefactory, I wasn't planning on using it in the final version anyway, so no biggie.
If XIAMultiTheme is capable of doing what I had envisaged for openClock, I will probably stop development, as you obviously know what you are doing much more than I do
However, a couple of points:
1) Size.
XIAMultiTheme seems to be a lot bigger and requires .NET - This seems to mainly be to do with the CxImage library - just PNG support seems to add more size than my entire app is! I am flabberghasted that supporting per-pixel Alpha PNGs takes this much, an alphablend routine can be done in a K or two, hundreds seems overkill. Apart from the requirement for rotation (for analogue clocks) I do not see why a full image lib is needed. Just a load and alpha blit.
2) Orientation awareness.
As in I don't see any in XIAMultiTheme. I am really happy with the way I have handled this in openClock - each item in the INI (XML in your case) has a "horizres" value associated with it. At render time, current screen width is compared to each item's horizres and if it matches, the item is drawn, if it doesn't then it isn't shown.
This provides a nice way to combine portrait, landscape and multi-res capabilities into one theme. And as long as you allow relative paths in the theme(eg 320\320bg.png, 240\240bg.png, common\common.png) then you can have a theme which supports all resolutions and orientations, and allow the user to store what they want on their PPC (eg if their device is qVGA, they know they do not need to put the 640 and 480 dirs on their PPC for a given theme, as they won't be used)
3) Stateful buttons.
Items like a voicemail button / wifi button etc should probably have two images associated with them - one for "no messages", one for "have messages". I was planning on putting something in openClock along the lines of specifying a reg key, an operator and an image.
eg:
regkey=HKEY_LOCAL_MACHINE\...
on=thisimage.png, gt, 0
off=thatimage.png
To set to thisimage if the key is of value greater than (gt) 0 or thatimage.png if not.
Good luck!
Click to expand...
Click to collapse
thanks you for your good words
1) beta version will be lighter ... (need to known what image loader use)
2) will be done on Page component (tab themes are already working)
3) will be done on sensor dll with "regex" (maybe)
XIAMultiTheme is in alpha development...
I would like to "merge" code with you or may be DLL collaboration.
XIAMultiTheme does NOT need .NET it's low level GDI "C" source
When XIAMultiTheme go on Beta status the dll will be around 10kb
Configurator is .net
Thanks you
Thanks for that mort!
However, if my entire app is (currently) 61K and it supports per-pixel alpha PNGs (Via the apparently bugged IImagefactory), then surely it is more than possible in less than 100K.
It seems like libpng must be grotesquely bloated for our needs. In an ideal world, someone would re-code SHLoadImage to not lose the alpha channel for PNGs. Maybe a workaround would be to convert the PNG into a 32bit per-pixel BMP with alpha before it is passed to SHLoadImage, as SHLoadImage deals with alpha BMPs just fine and AlphaBlend works just fine with AC_SRC_ALPHA data.
stefanux said:
thanks you for your good words
1) beta version will be lighter ... (need to known what image loader use)
2) will be done on Page component (tab themes are already working)
3) will be done on sensor dll with "regex" (maybe)
XIAMultiTheme is in alpha development...
I would like to "merge" code with you or may be DLL collaboration.
XIAMultiTheme does NOT need .NET it's low level GDI "C" source
When XIAMultiTheme go on Beta status the dll will be around 10kb
Configurator is .net
Thanks you
Click to expand...
Click to collapse
Hi stef,
I am more than happy to help out on your project with design ideas, testing and proofreading of english translations.
I have plenty of ideas on what the ultimate today screen widget app should feature, I just had to set my sights lower due to my (lack of) coding abilities.
Do you have a forum or something on your site? I don't see one.
I am slightly concerned about point (3) and your regex example. I would maybe try and keep it simpler, XML is already a little complicated for non-technical users to understand, throwing regexs into the mix may be the straw that broke the camel's back. That's why I went with INI files - simpler to use for lusers
evilc said:
Thanks for that mort!
... it supports per-pixel alpha PNGs (Via the apparently bugged IImagefactory), ....
Click to expand...
Click to collapse
Please try to do this test:
load 20 png's with imgfact. and start drawing all of them like a simple animation for 10 fps... image[]->Draw() after 5 minutes my application will blow up my pda (wm61) I thinks it's a "COM" bug because it happend only calling "Draw"
stefanux said:
Please try to do this test:
load 20 png's with imgfact. and start drawing all of them like a simple animation for 10 fps...
Click to expand...
Click to collapse
Are you kidding??? 10FPS? I have a kaiser!
Seriously though, if we can get a code snippet that proves this, surely we can get MS to issue a patch?
Related
I have a little project in mind, but would like some input from the pros to cut research time:
Is it possible to "wrap" a Today plugin dll with another, providing a "pass through" for operations (such as screen taps, etc)?
What I'm trying to accomplish is this: Add selectability and other one-handed d-pad operation to an older plugin that is not selectable.
What do you think?
it's possible but the problem is that the plugin have to keep track on what plugins it include and which handles it have to pass to them
could end up big and slow
Rudegar said:
it's possible but the problem is that the plugin have to keep track on what plugins it include and which handles it have to pass to them
could end up big and slow
Click to expand...
Click to collapse
This is specific to a single plugin - it would only keep track of one.
Perhaps plan B would be easier - a plugin that manipulates another plugin. Such that it would "appear" the older plugin was selected, etc. I guess I'd better go study some more...
Actually its really simple.
Any plug-in DLL exports a function called InitCustomItem. In this function the plug-in does all its initialization, and creates its window. The return value is the handle to this window which you can subclass to add functionality.
as for selection, there is a value in the registry for each plug-in (HKLM\Software\Microsoft\Today\Items) which controls whether the system passes selection events to the plug-in or not.
it has three settings:
0 - non selectable, item will be skipped by the system.
1 - Automatic, the system will paint the item and handle selection on / off
2 - Manual, the system will pass the selection event to the item and the item will take care of the rest. In this mode the return value of the WM_ACTION determines whether the selection is moving on. This is good for multiline plug-ins that don't want to give up focus when arrow keys are pressed.
levenum said:
Actually its really simple.
Any plug-in DLL exports a function called InitCustomItem. In this function the plug-in does all its initialization, and creates its window. The return value is the handle to this window which you can subclass to add functionality.
as for selection, there is a value in the registry for each plug-in (HKLM\Software\Microsoft\Today\Items) which controls whether the system passes selection events to the plug-in or not.
it has three settings:
0 - non selectable, item will be skipped by the system.
1 - Automatic, the system will paint the item and handle selection on / off
2 - Manual, the system will pass the selection event to the item and the item will take care of the rest. In this mode the return value of the WM_ACTION determines whether the selection is moving on. This is good for multiline plug-ins that don't want to give up focus when arrow keys are pressed.
Click to expand...
Click to collapse
Hey, thanks for the response! I've set the Selectability registry item for the older plugin, and it's ignoring it - that's what started me on this little project.
I'm a software developer by trade, but not with C++, so I don't want to waste people's time here asking a lot of dumb questions. If you could point me in the right direction on a couple of things, I'll go off and learn:
1. If all I have is a dll and nothing else (no .defs, etc), can I determine all of the functions it exports (other than InitCustomItem)?
2. Process check: My custom plugin's InitCustomItem would call old-plugin's InitCustomItem, snagging old-plug's hwnd. New-plugin would then initialize it's own window - transparent(?) and pass that hwnd back to windows. Also, my custom plugin would pass all messages to old-plugin, etc. Theoretically, old-plug would look and operate like normal?
If this is already written, just sent me the code!
Well I am afraid it will be difficult to do all this without C++. As far as WM based devices are concerned you need to use something that translates in to native code to create system components like the plugins son ,no .NET languages, and embedded VB doesn't do well on anything never that WM 2003 (not even SE), plus I am not sure if you can make DLLs with it at all.
To your questions:
1) There is a tool which comes with VS 6 called Dependency Walker. It shows you what functions a given DLL exports, what it imports from other DLLs and what DLLs it is link to. Woks on EXE files as well.
If you can't get that, download a demo of IDA 5. It's the most powerful disassembler for WM devices out there.
2) Not sure, I never tried anything like that. The thing is, the system resizes the plugins, on initialization (it controls height) and when screen rotation changes so if you pass back HWND for a window other than the one visible, it might cause some problems.
I think what you should do is learn about subclassing. It's when you replace the procedure of an existing window with your own (just replace the function, not create new window). You then get all the messages for that window, you can do what you want and call the original function when you done.
By the way, if you want to learn about writing plugins there is an article with code samples on this site: www.pocketpcdn.com and a lot of other interesting stuff.
Good luck.
What plugin is it? It might be easiest just to rewrite the plugin if you've got the code.
V
levenum said:
Well I am afraid it will be difficult to do all this without C++.
Click to expand...
Click to collapse
I should have been more clear - I am using C++, I'm just have to learn how to program with it first!
vijay555 said:
What plugin is it? It might be easiest just to rewrite the plugin if you've got the code.
V
Click to expand...
Click to collapse
I don't have the old-plugin source code. My little project is to add some sort of d-pad operation to the WeatherPanel plugin, which you're probably familiar with.
Progress: I've written and deployed my first little plugin - based on the source code samples available in the internet.
Next step: In my InitializeCustomItem, I thought I'd try to call WeatherPanel's InitializeCustomItem (instead of creating my own window). Thing is, I don't yet know how to properly link the WeatherPanel dll to my project. As expected, it only exports two functions: InitializeCustomItem and CustomItemOptionsDlgProc (I used dumpbin.exe)
I'll keep plugging away - any input would be appreciated.
Thanks for your help!
It's real easy:
Use LoadLibrary and GetProcAddress functions to call functions in other DLLs without linking them.
levenum said:
It's real easy:
Use LoadLibrary and GetProcAddress functions to call functions in other DLLs without linking them.
Click to expand...
Click to collapse
What a coincidence! My studying led me to the same functions.
From within my plugin's InitializeCustomItem, I was able to successfully load the dll with LoadLibrayl, GepProcAddress of its InitializeCustomeItem (at ordinal 240) and call it. But it whacks the Today screen so that none of the plugins load.
Next I thought I'd try FindWindow and EnumChildWindows to find it and all it's children. Then manipulate them by sending messages...
storyr said:
What a coincidence! My studying led me to the same functions.
From within my plugin's InitializeCustomItem, I was able to successfully load the dll with LoadLibrayl, GepProcAddress of its InitializeCustomeItem (at ordinal 240) and call it. But it whacks the Today screen so that none of the plugins load.
Next I thought I'd try FindWindow and EnumChildWindows to find it and all it's children. Then manipulate them by sending messages...
Click to expand...
Click to collapse
Update: So far, so good. As it turns out, EnumChildWindows doesn't work on the PPC, so I used GetWindow to find the plugin's handle. I can successfully send messages to it and initiate various actions.
Question: I'd like to visually indicate (on the old-plugin) what's being clicked (such as drawing a box around it). Is it possible to draw things outside of my own window?
It is, but it's tricky.
You can always use the GetDC function to retrieve the DC for another window and paint on it, but the problem is that unless you subclass the window you have no way of knowing when it repaints it self and all your changes are erased.
levenum said:
It is, but it's tricky.
You can always use the GetDC function to retrieve the DC for another window and paint on it, but the problem is that unless you subclass the window you have no way of knowing when it repaints it self and all your changes are erased.
Click to expand...
Click to collapse
I tried that exact thing (GetDC) and drew a rectangle in it, but it didn't do anything. I realized the reason was the WM_Paint event wasn't firing on old-plugin, and when it did, my stuff was erased (just like you said).
Next idea - open my own dialog window than overlays old-plug. The entire window needs to be transparent - except for the visual indicators that I position where I want. When the user ok's, I close the window and send the click to old-plugin...
Thanks again for keeping tabs on my progress..
No offence, but with all these rather advanced programming tricks you are attempting just to "sup up" an old weather plugin it looks to me like you would be better off just writing the whole thing from scratch.
It you are familiar with WinInet and / or sockets this should be pretty easy and it will look and work much better than the hack you are attempting now.
Plus you can make it exactly the way you like.
levenum said:
No offence, but with all these rather advanced programming tricks you are attempting just to "sup up" an old weather plugin it looks to me like you would be better off just writing the whole thing from scratch.
It you are familiar with WinInet and / or sockets this should be pretty easy and it will look and work much better than the hack you are attempting now.
Plus you can make it exactly the way you like.
Click to expand...
Click to collapse
No offence taken. I thought of that, but I figured this would be a good way to cut my teeth a little. Once I complete this little project, I may pursue that route...
Question: Do you have a favorite forum (or forums) besides this site that you use for your research/programming questions?
This is my favorite forum
But here are couple more sites I found very valuable:
www.pocketpcdn.com - They have tips and tricks with code examples arranged in categories like how to make MFC dialogs not full screen or the one I used in LVMTime to put the clock back on the taskbar.
www.codeproject.com - It's not specific to WM development but has tons of interesting stuff including entire sources.
You should also check out www.buzdev.net If you're not familiar with the great work of buzz_lightyear you should see some of the stuff he did for this forum like grab_it - the invisible ROM dumper.
OT
Just a quick OT question:
If I would move some of the plugin-dll's from \Windows to \Storage Card, would it be enough to change the adress within the corresponding item in the registry entry HKLM/Software/Microsoft/Today/Items ?
Of course I'm not talking about plugins like tasks a.s.o but rather third party plugins
Cheers
hrb
It won't work.
The problem is that the SD card is mounted too late so if you put the plugins on it they will not be loaded when device boots up.
You can move them to the extended ROM this way or to a folder other than windows but there is no way to move start-up stuff to SD.
Thanks for the help with this "little" project. After many hours, the product is out for beta testing. When it's released, I'll post more info...
Finished!
It's finished. The app is called WP-Pilot and it provides one-handed operation of WeatherPanel. If anyone's interested, it can be found here. Here's how it ended up:
There's a plugin (WP-PilotPlugin.dll) with an options dialog, and an executable (WP-Pilot.exe).
When the plugin gets selected, it looks for Weatherpanel. If it finds it, it fires off WP-Pilot.exe
WP-Pilot.exe opens. It does this stuff:
Look for WeatherPanel, and get it's screen coordinates.
Read the registry and determine which layout file WeatherPanel is using.
Open the layout file and read it: Record the coordinates of each "clickable" item found. This was a real PITA because of Unicode.
Sort the coordinates for left-to-right, top-to-bottom order.
Select the first coordinate and position a tiny window (10x10) at that x-y position.
Draw a "pointer" in the window (the type and color depends on what's selected in the options).
Show the window and process input:
[*]Left/right pressed - selected the next/previous coordinate and move the window to that location.
[*]Up/down pressed - close WP-Pilot and tell the plugin we're done.
[*]Center button pushed:
[*]Send a mouse click to the WeatherPanel plugin at the coordinates
[*]Close WP-Pilot and tell the plugin we're done.
Thanks again for your help!
Ok, most of you may find this totally useless as a plugin, but it was a combination of a request by user Treo_newb and a desire to create a sample plugin project that could be used as a base / example for plugin writers (I plan on doing an article on codeproject.com and this will be the source for it).
What does it do?
This plugin displays a string stored in registry.
The path is:
HKEY_CURRENT_USER\Software\RegDispPlugin
Value name: DisplayString
It checks if this string has changed several times per second when today screen is shown (as the system sends refresh message to all plugins) and displays the updated message if a change occurred.
What is it good for?
First, if you write apps using mortscript or similar like the user who requested this it will let your script display stuff on today screen.
Alternatively it could be used to mark your device today with a string that isn't as easily changed as user info.
The source is basically a skeleton plugin you can use to build your own plugin on (no license / copyright to limit you) and it already has several tricks needed for the plugin to display correctly:
VGA compatibility
Text size matching system settings
Proper header in settings dialog (like on system plugins)
Proper text color when selected (according to theme)
No blinking all today screen on change
Proper resize when switching between landscape and portrait
When I was writing my first plugin I could not find all these little fixes concentrated in a single article so I had to fish for each one as the bug reports came in.
Hope you will find this little project useful.
The plugin:View attachment RegDisplay.CAB
The source (eVC 4 project): View attachment RegDisplay.zip
Thanks for this!
Thank You Lev.
Thanks, Thanks, Thanks,
You are a legend.
I was almost through with my today plugin and was trying to figure out reading registry values and all of a sudden I get a PM from u about the plugin !!!
Very Cool !!!
OK a few questions,
1. I know that WM_TODAYCUSTOM_QUERYREFRESHCACHE is called for refreshing the today plugin, any ideas about when is it called.
I read somewhere that it was 2 seconds. Is it true?
2. I saw ur code and u have exposed CustomItemOptionsDlgProc in RegDisplay.def, but when I installed the cab file the 'options' is not enabled.
I manually changed the resistry and changed options to dword = 1 and saw ur name and email address.
u might want to enable that by default so that people can notice ur work.
I am planing a commercial release of a new project on basis of this.
Thanks again,
Shailesh
First, you're welcome.
shaileshashar:
1) I ran a debug print on this message once on an iPaq 1710 and it seems to be sent several times per second. This could differ from OS to OS or even from device to device, I am not sure.
If you need specifically timed refresh, or you have an event triggered on new data, I suggest using a timer or maybe a thread that will wait on an event. You can refresh your plugin from anywhere in code by calling InvalidateRect with your window handle.
2) I messed up the cab at first, forgetting to add the Options reg value. Then when I went to upload the fix, I couldn't access the site for about an hour (no idea why, I even rebooted the PC to Ubuntu). Should be fixed now, but I will check it later again (I have to go back to XP for that).
Good luck with your program.
Suggestion
levenum said:
First, you're welcome.
shaileshashar:
1) I ran a debug print on this message once on an iPaq 1710 and it seems to be sent several times per second. This could differ from OS to OS or even from device to device, I am not sure.
If you need specifically timed refresh, or you have an event triggered on new data, I suggest using a timer or maybe a thread that will wait on an event. You can refresh your plugin from anywhere in code by calling InvalidateRect with your window handle.
2) I messed up the cab at first, forgetting to add the Options reg value. Then when I went to upload the fix, I couldn't access the site for about an hour (no idea why, I even rebooted the PC to Ubuntu). Should be fixed now, but I will check it later again (I have to go back to XP for that).
Good luck with your program.
Click to expand...
Click to collapse
Thanks for the help, will check the fixed cab.
Also a suggestion:
A custom icon could also be incorporated. You can give a option to load a custom icon next to the text in the today plugin.
I know anybody can modify ur code and do it but still.
Actually, I probably should have mentioned this in the original post but I have no intention of adding options to this thing.
This would only complicate the code and turn it in to an actual app instead of a sample project.
But by all means feel free to make suggestions. If this thing does become popular, when I am done with my other projects (like LVMTopBat) which won't be any time soon (unfortunately) I will release a separate version of this plugin with all kinds of options that can be controlled both by user (form the options dialog) and by other apps through registry.
Maybe things like text alignment, size, bold / Italic / underlined.
P.S.
The reason I put the string this plugin loads under HKEY_CURRENT_USER instead of the HKLM where the rest of the plugin registry resides is because by default the HKEY_LOCAL_MACHINE on WM 5 and higher has a security restriction. For example you can not write to it using RAPI, only by authorized (or signed) app on the device. The HKEY_CURRENT_USER on the other hand is open for all.
levenum said:
P.S.
The reason I put the string this plugin loads under HKEY_CURRENT_USER instead of the HKLM where the rest of the plugin registry resides is because by default the HKEY_LOCAL_MACHINE on WM 5 and higher has a security restriction. For example you can not write to it using RAPI, only by authorized (or signed) app on the device. The HKEY_CURRENT_USER on the other hand is open for all.
Click to expand...
Click to collapse
Thanks for the info, I never knew that.
Thank you so much! This was exactly what I was looking for!
levenum said:
...But by all means feel free to make suggestions.
Click to expand...
Click to collapse
As a frequent mortscript user I think, this great app might be even more usefull, if the string was shown in an "allways on top" message box instead of the today screen. The Today screen might be obscured by other active windows during the scripts runtime and the plugin eats precious today screen estate also while being unused, doesn't it?
In that case (of a standalone application) I would furthermore introduce some kind of termination string (or reg. value) to end the display application.
Code:
- start mortscript
- writes first string to registry
- starts display application (run)
- updates string in registry whenever appropriate
- ...
- writes termination string to registry
-> display applications self-terminates
- ...
- end of mortscript
Honestly, I already do use something comparable with mortscript (employing a conditioned sleepmessage loop and reading from the registry too), but this could be much nicer and more elegant.
Just my 2 cents... What do you think?
I think something like that would be better implemented by the mortsrit program it self.
It could be a function like MessageBox API in windows which you could then command on and off. Having it built in would save precious resources on the device that would be wasted by having an extra app run constantly in background.
This is just my thought though.
I'd suggest contacting the developer of mortscript and discussing it with him.
levenum said:
I think something like that would be better implemented by the mortsrit program it self.
...
I'd suggest contacting the developer of mortscript and discussing it with him.
Click to expand...
Click to collapse
Mort knew about that request and by chance just announced to so.
Thanks anyway.
Hello levenum,
I just joined the community. Reason being, I found your RegDisplay plug-in
You call it a sample project, but the impact is that of an awesome solution.
Great for MortScript, but equally useful in BASIC applications that write
messages to the registry which is show upon screen minimization.
I regret not being a C programmer (mainly BASIC), else I'd love to further
develop this jewel.
Your plug-in runs flawlessly in an iPAQ 210 under WM6 Classic.
Cheers and Respectful Greetings
Robert
CLSID for registry display plugin
What is the CLSID for the Registry Display Plugin? I am going to have to edit the XML file that defines my home screen in order to get the plugin to show up. I am using Facade to control my home screen, and the only plugins that it will show in its list are those currently in use in one of the XML files in the Application Data\Home folder. All other new plugins require editing the XML. Thanks for your help.
levenum said:
Ok, most of you may find this totally useless as a plugin, but it was a combination of a request by user Treo_newb and a desire to create a sample plugin project that could be used as a base / example for plugin writers (I plan on doing an article on codeproject.com and this will be the source for it).
What does it do?
This plugin displays a string stored in registry.
The path is:
HKEY_CURRENT_USER\Software\RegDispPlugin
Value name: DisplayString
It checks if this string has changed several times per second when today screen is shown (as the system sends refresh message to all plugins) and displays the updated message if a change occurred.
What is it good for?
First, if you write apps using mortscript or similar like the user who requested this it will let your script display stuff on today screen.
Alternatively it could be used to mark your device today with a string that isn't as easily changed as user info.
The source is basically a skeleton plugin you can use to build your own plugin on (no license / copyright to limit you) and it already has several tricks needed for the plugin to display correctly:
VGA compatibility
Text size matching system settings
Proper header in settings dialog (like on system plugins)
Proper text color when selected (according to theme)
No blinking all today screen on change
Proper resize when switching between landscape and portrait
When I was writing my first plugin I could not find all these little fixes concentrated in a single article so I had to fish for each one as the bug reports came in.
Hope you will find this little project useful.
The plugin:View attachment 41592
The source (eVC 4 project): View attachment 41583
Click to expand...
Click to collapse
This is great! I was asked if I could write a today screen plug-in for my weather application (http://forum.xda-developers.com/showthread.php?t=445576) - I couldn't since I don't have the skills and I'm writing .NET code - but this is exactly what I needed.
I'm adding support for this plug-in and will of course give credits to you.
Folks,
I have created a small photo viewing application that I wanted to publish to the world. Key features are
- Native C code. No dependencies on .NET or any other library
- Tiny (just 25Kb)
- Full screen photos with gestures and hot-spots
- Slide-show mode
- Nice transitions (you can see them all in the slide show mode)
I have tested this on my GPS (CE 4.2) and PDA (Hermes) and it works quite well.
Gestures:
- Slide left to go to next photo in list (You can also use the wheel down for this)
- Slide right to go to previous photo list (You can also use the wheel up for this)
- Slide up to go to last photo in list
- Slide down to go to first photo in list
Hot Spots
- Top left to open a specific folder. Folder navigation is done by sliding up and down and select the <This Folder> to select
- Bottom left to open a specific photo. Again, you can slide up or down or go to a specific folder
- Bottom Right to start/stop slide show mode. Slideshow is 3 seconds. You can change the config file to specify different interval
- Top right to exit
- Right edge of screen to go to next photo in list
- Left edge of screen to go to previous photo list (You can also use the wheel up for this)
- Bottom edge of screen to go to last photo in list
- Top edge of screen to go to first photo in list
Configuration
CEPhotoViewer saves its configuration in CEPhotoViewer.cfg in the same folder as the exe. This file contains the last open folder and the slide show timeout
Startup
- On startup CEPhotoViewer looks for any JPG/BMP/GIF images in the program's folder. Else it prompts you to select a folder. Once selected the config file is created and subsequent runs, it will automatically pickup that folder
Bugs
- CEPhotoViewer uses native microsoft DLL to load a image. Depending on the speed of your CPU, this loading might be slow. Photos resized to the correct size (under 640x480) load pretty quickly. Large (2MP+) photos take a couple of seconds to load. Perhaps someday I will include native JPG loading codeDone
- CEPhotoViewer is built for ARM CPUs only. I can build for other CPUs but dont have a device handy
Looking forward to your comments. Im also working on finishing a MP3 player and a launcher (more appropriate for GPS devices)
Version history
- v0.67 (3/25/2008)
First public release- v0.68 (3/26/2008)
Integrated JPEG processing. Much faster in loading big images (although the size tripled from 20Kb to 60Kb)Added edge hot-spots to navigate in addition to slide gestures
Feature Request
What do you think of adding in touch Pan, Tilt, Zoom, & Rotate? Also, it would be cool if it auto rotated based on the original pictures orientation.
Thanks,
Curious G
i'll give this a shot when i get home
curious george said:
What do you think of adding in touch Pan, Tilt, Zoom, & Rotate? Also, it would be cool if it auto rotated based on the original pictures orientation.
Thanks,
Curious G
Click to expand...
Click to collapse
Forgot to mention, pictures are auto-rotated if they can fit better in the screen. Also auto-rotates if you change the display (like when I pull out the keyboard)
Nice but it wouldn't load my actual (2mp) photos. Sliding is a bit slow but very smooth. Wouldn't quit and at some point all corners stopped working.
Trekvogel said:
Nice but it wouldn't load my actual (2mp) photos. Sliding is a bit slow but very smooth. Wouldn't quit and at some point all corners stopped working.
Click to expand...
Click to collapse
Loading large images is time consuming, sorry, thats the way microsoft has implemented JPG processing. The corners are not 'not responding', the program is still trying to load the image.
Im trying to compile ijl jpg library that can loaded scaled images, that way I only decompress the size I want
3/26 - Version updated
Guess I'm in the minority who resizes images to fit in PDA screen. Due to popular demand, I have integrated the IJG jpeg library to considerably speed up loading of large images (largely due to internal image scaling)
Also added edge hotspots to navigate images, rather than slides which are bit cumbersome
my personal opinion(i havent seen program YET):
any viewer, that cannot show gif/animgif/png/tga/bmp files is pointless.
it doesn't matter how "touch"-ed it will be.
so - i am gonna update opinion after tests..
nothin said:
my personal opinion(i havent seen program YET):
any viewer, that cannot show gif/animgif/png/tga/bmp files is pointless.
it doesn't matter how "touch"-ed it will be.
so - i am gonna update opinion after tests..
Click to expand...
Click to collapse
It does show gif and bmp. Adding png is trivial (libpng can be compiled easily in CE, both PNG and TIF take about 100Kb each). My intent is to what cover 80% of the people would want.
Just tried it on my Trinity and, while the transition speed is nothing to write home about, the software works. Not sure if i prefer this or S2V, but it has to be said this is a nice application.
Edit
Could do with more space at the top when navigating folders, the directory path disappers under the "This Folder" button.
Please could we have screenshots?
iamwhoiam said:
Please could we have screenshots?
Click to expand...
Click to collapse
It shows your photo on the full screen, so screenshots are not of any use
deedee said:
Just tried it on my Trinity and, while the transition speed is nothing to write home about, the software works. Not sure if i prefer this or S2V, but it has to be said this is a nice application.
Edit
Could do with more space at the top when navigating folders, the directory path disappers under the "This Folder" button.
Click to expand...
Click to collapse
The main goal of writing this app was to have it working on all CE devices (including GPS that do not have the .NET framework installed).
Also, there are more transitions than just the slides that are visible when you are in slide-show mode
Amazing Program!!
I've just gotten myself a windows mobile phone. I looked everywhere for a simple photo viewer that could scroll through images by tapping on the left or right of the screen. I didnt understand why resco photoviewer or pqv or any of those other photo viewers didnt have this feature. It was so frustrating.
Also I wanted to browse folders starting at a pre-configured Picture folder. I didnt want the program to go scanning my whole PDA for pics including gifs and pngs for some other softwares.
Finally found this program and I'm really happy.
I wonder if you're still developing this program though? This thread doesnt seem to be active anymore. I hope you'll still continue developing this program.
If you're too busy, I'd be happy to help in some aspects of coding or improving the program. It really is that amazing to me.
Hope this program is still alive.
Lodd said:
I've just gotten myself a windows mobile phone. I looked everywhere for a simple photo viewer that could scroll through images by tapping on the left or right of the screen. I didnt understand why resco photoviewer or pqv or any of those other photo viewers didnt have this feature. It was so frustrating.
Also I wanted to browse folders starting at a pre-configured Picture folder. I didnt want the program to go scanning my whole PDA for pics including gifs and pngs for some other softwares.
Finally found this program and I'm really happy.
I wonder if you're still developing this program though? This thread doesnt seem to be active anymore. I hope you'll still continue developing this program.
If you're too busy, I'd be happy to help in some aspects of coding or improving the program. It really is that amazing to me.
Hope this program is still alive.
Click to expand...
Click to collapse
Glad to hear that this application is working well for you.
I have not stopped development on this, added additional features like PNG, GIF decoding and automatic rotation.
This being a PPC forum, there is not much need for this app since there are multiple options (including built-in applications). I had made this app and many others primarily for GPS and other low end devices without the standard libraries.
I will update this thread with the latest version and also add other applications I have built (including native MP3/OGG player, simple shell, GPS dashboard etc), all totally skinnable and configurable
The program has been amazing. Loads huge pictures with no problem. It's definitely faster than Vito's EyePhoto.
But Coolsva, I have a question. Now call me crazy, but I want to be able to set it up so that when I click a jpg file in file explorer or total commander, it will open up in your photoviewer instead of the windows mobile default viewer (coz it sucks). What're the parameters to do so? I tried the normal parameter "%1" but it doesn't seem to work.
I'm glad you're still working on this program.
Cool program , but zoom would be nice feature
coolsva said:
I will update this thread with the latest version and also add other applications I have built (including native MP3/OGG player, simple shell, GPS dashboard etc), all totally skinnable and configurable
Click to expand...
Click to collapse
Looks interesting, please do it !
Just now landed at this thread after spending a while checking out google results for "windows mobile picture viewer". Coolsva's prog sounds very worth trying, but I'm wondering if 0.68 is still the latest release?
HarpShot
________________________________
He had a photographic memory that was never developed.
Just saw this too, this could have real potential
I'm also searching for a simple photo viewer like Lodd mentioned
Hi.
I was playing a little bit using VS2008 and Windows Mobile 6 SDK to create my own mobile application in C#.
But what really is annoying is the missing ability of creating 'nice' UIs.
For example G-Alarm (http://forum.xda-developers.com/showthread.php?t=422362) looks much nicer then a 'simple app'.
How are those apps be done?
Or is it raw graphic programming?
Any tips appreciated.
Please get me on the road. ;-)
Regards,
AtzeX
You can use images to create nice UI's. You can make nice images with photoshop or paint.net
Sure, but that would mean, that the UI is static.
What about some dynamic, like buttons and the effects when hovering over them etc.?
Is this all done by combining different images?
Is there somewhere a sample-application demonstrating that technics?
Or is there any toolbox what they use?
AtzeX said:
Sure, but that would mean, that the UI is static.
What about some dynamic, like buttons and the effects when hovering over them etc.?
Is this all done by combining different images?
Is there somewhere a sample-application demonstrating that technics?
Or is there any toolbox what they use?
Click to expand...
Click to collapse
H-overs are usually just 2 pictures .
...not to forget the pressed state.
So, do I really have to become a graphic artist thatfore?
No other way/tricks/(common)libraries?
In what I've done, use a picturebox rather than a button, and then change the image on the mousedown/mouseup events.
If you like the button styles of a particular thing (e.g. the Diamond/Opal/whatevers volume control), I'd extract the image, resize it and you're good to go.
Obviously ask the relevant owners permission first!
Attached is the Jade volume control button (I have it in transparent, but it's a large file... I'll upload it somewhere else if wanted) which may be of use as a simple On/Off button.
l3v5y said:
In what I've done, use a picturebox rather than a button, and then change the image on the mousedown/mouseup events.
If you like the button styles of a particular thing (e.g. the Diamond/Opal/whatevers volume control), I'd extract the image, resize it and you're good to go.
Obviously ask the relevant owners permission first!
Attached is the Jade volume control button (I have it in transparent, but it's a large file... I'll upload it somewhere else if wanted) which may be of use as a simple On/Off button.
Click to expand...
Click to collapse
so they aren´t released yet ?!? OMG, xda is hacking out every piece of software but no complete diamond gfx-pack ?
would be really great, I´d like to modify them and use them for some own projects.
Thanks l3v5y!
But unfortunately I will have no time left in the next weeks, because I will be away.
But I will try and respond when I'm back.
Regards,
AtzeX
Is it possible to make pictures/pictureboxes transparent???
I want to embed png files containing transparency information
I tried so long but couldn`t find out....
thx
ya, welcome to the .net mobile world lol. I've been trying to come up with some nicer guis on my own for a few weeks now, with little luck due to poor documentation/examples and understanding of the gdi drawing capabilities.
if possible, please keep us (me) updated on what you find or code. there's just so little open source or documentation in the .net mobile world (it seems to me at least) for creating any controls (other than odl's) that try to move themselves away from the standard look and feel of the textboxes, comboboxes, etc.
I was wondering if the xFlib libraries could be used to create apps... http://www.xflib.net/
Then why would I want to use XFlib ???
XFlib has been designed following a few principles : completely free library, very simple to use, and with good enough performance to allow you to do your games without too much technical knowledge…
It all started when we, at the XFTeam, decided to do some PocketPC development. There were already tons of solutions out there, like using .Net, but pretty much everything was Windows-based, which was a problem for the Linux users That's where CEGCC came in to help : it provided us with a great free cross-platform compiler for ARM PocketPC !
We have been strongly influenced by GBA/NDS development, so the library was also designed with strong analogies to the old school 2D consoles : manage your sprites, bitmap layers, tiled backgrounds, text, etc…
Click to expand...
Click to collapse
Nice site for creating buttons:
http://cooltext.com/Buttons
Transparency and Custom controls
Transparency is a pain in the but with .net. The only way I was able to get it to work was by making unsafe system calls by add using "System.Runtime.InteropServices;"
and call Alphablend from the coredll.dll file.
[DllImport("coredll.dll")]
extern public static Int32 AlphaBlend(IntPtr hdcDest,
Int32 xDest,
Int32 yDest,
Int32 cxDest,
Int32 cyDest,
IntPtr hdcSrc,
Int32 xSrc,
Int32 ySrc,
Int32 cxSrc,
Int32 cySrc,
BlendFunction blendFunction);
Not only is it a pain but it seemed to slow down my animations significantly.
or using the native .NET GDI you can do this the following way:
this method olny makes an exact color transparent but you can't set transparency values.
System.Drawing.Imaging.ImageAttributes attr = new System.Drawing.Imaging.ImageAttributes();
// "this sets your transparent color, the color you want to disappear"
attr.SetColorKey(Color.White, Color.White);
e.DrawImage(bmp, dstRect, 0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel, attr);
the code above is an incomplete segment that would display a bitmap named bmp with the exact color white gone.
I can post an example in C# if people want it. But basically for a unique look, I don't use any windows controls. I make a buffered picture the size of the display and bitblit the images off screen and switch them in like in a video game rendering. I draw how each control should look and then monitor mouse location and click locations to determine what control is being interacted with and what images to switch them out with.
I release a custom UI replacement program called FlipSlide here http://forum.xda-developers.com/showthread.php?t=385036 there is source code available from http://sourceforge.net/projects/flipslide/ for this that uses these techniques.
hope that helps somebody.
AtzeX said:
Hi.
I was playing a little bit using VS2008 and Windows Mobile 6 SDK to create my own mobile application in C#.
But what really is annoying is the missing ability of creating 'nice' UIs.
For example G-Alarm (http://forum.xda-developers.com/showthread.php?t=422362) looks much nicer then a 'simple app'.
How are those apps be done?
Or is it raw graphic programming?
Any tips appreciated.
Please get me on the road. ;-)
Regards,
AtzeX
Click to expand...
Click to collapse
You can read this article: Building Graphically Advanced Applications with the .NET Compact Framework 3.5
thx for your help chetstriker
i will download the sourcecode and try to figure it out...
For those who know what it is, I have created a complete install for the HP 48GX Emulator optimized for WVGA devices. The emulator itself is based on Sébastien Carlier's Emu48 (now maintained by Christoph Gießelink).
My goals were to have a realistic but finger-useable HP 48GX. I have included the complete package in a single CAB (the ROM is an HP 48GX-R model). As HP released the ROMs for all the 48 models about 9 years ago, I can't imagine them complaining that I'm packaging them together as a useful package these days
See the attached Todo.txt before posting any bug reports please. FYI, I do not really plan to address any of the Todo items anytime in the near future.
Enjoy!
HP 48GX-R 1.18.1
Change Log
2009.09.24
v1.18.1
Converted 709 KB bmp file into 94 KB gif with no data loss. The screen should now load much faster.
Updated CAB file installation to allow for Storage Card installation.
P.S. The thumbnail doesn't even begin to do it justice. I spent *DAYS* on the visual appeal of the interface and for anyone who owns/owned an HP 48GX I hope you'll agree the level of detail and realism is nearly perfect.
P.P.S. If you don't know what an HP calculator is, or more importantly what RPN means, then its probably not worth your time even trying this.
48GX State Files
I have now attached some state files which includes two .e48 files and a SHARED.BIN file. The SHARED.BIN file is a 512K Port 2-5 attached card which both .e48 files share. The files are as follows:
SHARED.BIN
Port3
EDFlags 2.0G
HPTabs (Part of the Jazz package, see below)
Hack 9.4.1 (Based on Hack 9.4 with my own customizations)
StringWriter 4.4
MiniWriter 1.2
SmartKeys 1.59
Port2
Unitman 7.2001
QPI 4.3
ALG48 4.2
ALG48_SpecialFunction 4.2 (Part of the ALG48 package, see above)
ALG48_LongPrecision 4.2 (Part of the ALG48 package, see above)
ALG48_SymbolicIntegration 4.2 (Part of the ALG48 package, see above)
ChemLab 2.7
Neopolys 6.5
Bode-Routh 7.1
HP 48GX-R Math.e48
Port1
Erable 3.201 Beta
Marable
Erable_MODULO 3.2 (Part of the Erable package, see above)
Erable_GEO 3.2 (Part of the Erable package, see above)
Erable_PREP 3.2 (Part of the Erable package, see above)
Erable_LIN 3.2 (Part of the Erable package, see above)
Matrix 1.2
MathTools 7.0
Universal Font Library 1.0.2
Port0
Java 3.6a
HP 48GX-R Dev.e48
Port1
Jazz 6.8
Universal Font Library 1.0.2
MathTools 7.0
Matrix 1.2
Port0
Java 3.6a
Included in the zip is a file called InstallConfigure.txt which is simply the steps I took to create the .e48 files. Please note that I did not include the application .lib files themselves, though I did link most of them above. Remember, you can always recall them to the stack and save to your device if you plan to use any of them to make your own state file(s) from scratch.
48GX WVGA Photoshop Source
If your goal is to modify the visual appearance of the calculator without modifying the position or operation of any of the keys (onscreen or keyboard) then you may be interested in downloading the Photoshop source (attached).
Using it you must create a BMP file that is dimensionally identical to the one included in my installation (else you must change the KML appropriately). This means that there must be the entire image with no buttons pushed followed by the annunciators, followed by an image with the buttons pushed (without the annunciators again though). See the BMP that comes with the installation to know what I am talking about here.
The photoshop source is currently set to output an image with no buttons pressed and the annunciators. You will save as a BMP image to get the initial image with annunciators. You must then hide all the appropriate layers (and there are MANY) for unpressed button mode, and finally show all the appropriate layers (again there are MANY) for pressed button mode. Now change the image canvas size (cutting 14 pixels--the annunciators) from the bottom of the image, and save this as a BMP image. You will then take the first BMP image, expand the canvas size by 748 pixels at the bottom, adding the second BMP image (with the pressed buttons) in that area. Then simply merge layers and convert that image to Indexed color mode (selective) and save as the final BMP image.
If you are planning on changing colors note that where possible all you have to do is select every appropriate text layer and then change the colors for all of them at once. However, you will notice there are two layers (one for text graphics, and one for button graphics) that you cannot do this. You may deal with these in one of two ways:
Use the wand tool selection with shift to select all items of a given color, and then use some form of Image|Adjustment|... to match the colors.
Recreate the items manually. This is where the HP48.csh file comes into play. These are vector items I created for some of the button graphics (and annunciators). Access them through the custom shape tool (load custom shapes from file).
The button pressed version of the button graphics is precisely the same as the non-pressed version, simply shifted down one pixel. So my recommendation there is to simply make changes to the non-pressed version, duplicate it, shift down one pixel, and make that the new (Pressed) layer.
If you spend the time to properly create a graphics file that you think others would enjoy, please upload it and the source for others!
Cheers!
I still have my 48gx from more than 10 years ago, now I am just a HP12c type of guy
Excellent Work! Much appreciated! I also have a Emu48 version used by a company called EaglePoint (used to be SMI). It is called Pocket SMI v8. I have a licensed version but it is no longer supported. It is basically a custom tweaked Emu48 with a different skin and kml script specifically for surveyors/engineers. I would like to modify the skin but I am not sure how to get started...
Very Nice! Thanks much!
You think you can skin it for my 48SX as well?
The GX colors annoy the heck out of me...
wow, I haven't tried it yet but will, awesome idea. I still have my 48GX from college but I doubt my professors would like me to use cell phone during tests.
Thanks, will try it.
Thanks!
Quentin- said:
For those who know what it is, I have created a complete install for the HP 48GX Emulator optimized for WVGA devices. The emulator itself is based on Sébastien Carlier's Emu48 (now maintained by Christoph Gießelink).
[...]
Click to expand...
Click to collapse
AWESOME!!!!
glhs509 said:
Very Nice! Thanks much!
You think you can skin it for my 48SX as well?
The GX colors annoy the heck out of me...
Click to expand...
Click to collapse
If you have Photoshop and some time/know-how to make minor changes (difference in keys) to the KML file I can provide you with the graphics source that you can work with to make an SX skin.
Thank you!
This is fantastic, I will be looking for any updates and improvements. Will test and report back.
Wow... that's amazing...
...Here's my HP 48SX from my college years (circa 1992) for comparison...
glhs509 said:
Very Nice! Thanks much!
You think you can skin it for my 48SX as well?
The GX colors annoy the heck out of me...
Click to expand...
Click to collapse
See the original post now for the Photoshop source files!
Version 1.18.1
For those that subscribe to the thread, this is notification of a new version in the First Post.
Change Log
2009.09.24
v1.18.1
Converted 709 KB bmp file into 94 KB gif with no data loss. The screen should now load much faster.
Updated CAB file installation to allow for Storage Card installation.
Thanks a lot for this.
If anyone doesn't know there is a HP Calculator Conference in Fort Collins, CO next weekend.
http://holyjoe.net/hhc2009/
help on resizing the skin hp48gx
I have tried to resize it with photoshop, but I don't know how to remap the keys.
Could be a way to include scroll bar option?
Thanks