|
Well it always worked as I described for me. But I admit I haven't heard of the canonical mode before, so I'm going to trust you on this.
GOTOs are a bit like wire coat hangers: they tend to breed in the darkness, such that where there once were few, eventually there are many, and the program's architecture collapses beneath them. (Fran Poretto)
|
|
|
|
|
Hi,
There are icon for Maximize and Restore Down on Wondow Title.
Can I change Maximize icon to Restore down on button click?
|
|
|
|
|
|
I am processing the WM_MOUSEWHEEL messages in a C++ application,
void CView::OnMouseWheel(
HWND hWnd,
int xPos,
int yPos,
int zDelta,
UINT fwKeys
)
{
zDelta /= WHEEL_DELTA; if (zDelta != 0)
{
OnVScroll(hWnd, NULL, zDelta > 0 ? SB_LINEUP : SB_LINEDOWN, 3);
}
}
</blockquote>
but when I use the touchpad nothing happens. Following the advice in the MSDN documentation I divide the zDelta value by 120 (WHEEL_DELTA) to calculate the (approximate) number of lines to scroll. The debugger shows that the resulting value is always zero. If I use my mouse and turn the wheel it scrolls correctly. The weird part is that using other applications (VS, Word, Chrome etc.) the touchpad works correctly. So I conclude that the code should somehow get some other information that identifies the touchpad, and adjusts the delta accordingly. Anyone else seen similar problems?
[edit]
Thanks to David D's sugestion I modified the code to accumulate deltas that are less than the value of WHEEL_DELTA, thus:
static int myDelta = 0;
if (abs(zDelta) < WHEEL_DELTA)
{
myDelta += zDelta;
zDelta = myDelta;
}
zDelta /= WHEEL_DELTA; if (zDelta != 0)
{
myDelta = myDelta % WHEEL_DELTA; OnVScroll(hWnd, NULL, zDelta > 0 ? SB_LINEUP : SB_LINEDOWN, 3);
}
which works a treat.
Note that I use the value 3 for the number of lines to scroll. In a proper commercial application the code should use the value of the system parameter: SPI_GETWHEELSCROLLLINES .
[/edit]
modified 14-Jun-19 9:09am.
|
|
|
|
|
I found the mouse wheel events specific to the "mouse wheel".
When using only touch (tablet swipe) I got the scrolling, but the "wheel event" that I used to detect "at bottom or top" no longer fires and I need to find something else. I think it now has to tie into a "view changing" and / or "view changed" event and / or manipulation started / ended.
(And I think a touchpad is treated as a "pointer" in Windows 10).
The Master said, 'Am I indeed possessed of knowledge? I am not knowing. But if a mean person, who appears quite empty-like, ask anything of me, I set it forth from one end to the other, and exhaust it.'
― Confucian Analects
|
|
|
|
|
The messages are coming through correctly, but the delta value is always less than 120. That is unless I give a fast swipe from top to bottom of the pad. I have checked the parameters sent with the message and, apart from the delta value, they are the same for the mouse or the touchpad. More debugging required I expect.
|
|
|
|
|
The touchpad is just a mouse to the system, but it sends WM_MOUSEWHEEL messages somewhat differently. I have added the solution to my original post.
|
|
|
|
|
Glad you got it working.
Yes, "delta" is a double, so it has quite a range.
I needed the "Manipulation events" which give scroll direction and distance.
The Master said, 'Am I indeed possessed of knowledge? I am not knowing. But if a mean person, who appears quite empty-like, ask anything of me, I set it forth from one end to the other, and exhaust it.'
― Confucian Analects
|
|
|
|
|
The strange thing was that using both the debugger and Spy++, I could not 'see' the multiple messages coming in. In both cases after a scroll gesture on the touchpad, they both showed just one message and then went back to the application window. So it as if the delta values were just too small.
BTW, thanks for your interest.
|
|
|
|
|
Is your message loop receiving any other messages (e.g., WM_TOUCH ) when the touch pad is being interacted with?
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
|
|
|
|
|
Not sure about that, but thanks I will definitely check.
|
|
|
|
|
No, it never gets WM_TOUCH. But see my update and solution.
|
|
|
|
|
Hi,
Richard MacCutchan wrote: I divide the zDelta value by 120 (WHEEL_DELTA) to calculate the (approximate) number of lines to scroll.
While it is true that the many of the old mouse drivers sent WHEEL_DELTA in multiples of 120 that is not always the case for high-precision mice and touchpads.
You are probably getting values much smaller than 120. To fix your code you need to keep track of the delta modulo of +/- 120 in a static local or class variable and add/subtract the latest delta from the previous value.
I also observe that you are hard-coding the line count rather than retrieving the user preference via SystemParametersInfo with SPI_GETWHEELSCROLLLINES.
Best Wishes,
-David Delaune
|
|
|
|
|
Randor wrote: you need to keep track of the delta Thanks David, that works perfectly - simple when you know how. As to the fixed value, this is purely for personal use so I am not too concerned with system settings; although I notice that 3 is the default value.
|
|
|
|
|
Richard MacCutchan wrote: Thanks David, that works perfectly
Looks good, although I do see a minor issue with your latest code.
You are dropping the remainder without the modulo operation. Rather than setting your delta to zero you should keep the remainder after scrolling with:
myDelta = myDelta % WHEEL_DELTA;
Such a precision loss is probably not a big deal for simply scrolling a text window. But let's make our code samples more correct.
Best Wishes,
-David Delaune
|
|
|
|
|
Thanks again, I will certainly update my code (and the original question).
|
|
|
|
|
Hi all!
I want to build a program to manage other processes. The program is responsible for any process that suddenly stops and the program will call back that process. I am wondering how to use CreateEvent() to create a global event variable to manage it. I hope you give me advice and methods to solve that problem.
Thank you!
|
|
|
|
|
|
It is true that the program I will develop should be a service. Do you have experience with this issue please share with me. thank you very much!
|
|
|
|
|
Here is but one of many examples.
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
|
|
|
|
|
Well, it was more than six years back... I used the NSSM - the Non-Sucking Service Manager
The most important thing is you could used the original UI application to use with..., however, in "service" mode you must forbid all UI features.
|
|
|
|
|
I'm trying to change a given string in a function, but I send a string, try to change it directly and get a core dump, so I tried to create a string in the function, but it doesn't send the correct string.
This function must eliminate all Capital letter's it's a simple one, but I am making a mistake and don't see where.
Can any one help me please.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define false 1
#define true 0
char* my_strdelupper(char* s){
int i,j, len;
char aux[100];
char debuging;
len = strlen(s);
j = 0;
for (i = 0; *(s + i) != '\0' < len; i++){
if (!isupper(*(s+i))){
printf("%c",*(s+i));
debuging = *(s + i);
*(aux + j) = debuging;
j++;
}
}
*(aux + j) = '\0';
printf("\n");
puts(aux);
return strcpy(aux, aux);
}
int main()
{
char *s3="Quem quer casar com um programador?";
printf("%s\n",my_strdelupper(s3));
return 0;
}
|
|
|
|
|
Why not using the std::string with all its and other std methods?
|
|
|
|
|
|
You have: char *s3 = "..." . Although s3 is declared as char * the type of the string is const char * . Use char s3[] = "..." instead.
|
|
|
|