|
I'm using Microsoft Visual Studio 2005 and I'm new to MFC application. The task I'm given is to create a popup menu (CMenu::CreatePopupMenu) somehow looks like a list control. This occurs to do some limitation of a list control.
Is there a way to do it without using WM_DRAWITEM and WM_MEASUREITEM? Or does anyone knows how to attach a popup menu onto a picture control (CStatic)? or ShowWindow to show the popup menu permanently? Either way is fine with me.
Will be waiting for reply~ TQ!!!
Sincerely,
arthur89kim
|
|
|
|
|
Can you explain a bit more what you need?
What I understood is that you want to use a popup menu instead than a list control because you want something like a list control with reduced functionalities and custom behaviours; isn't it?
Can't you write a class that inherit from CListCtrl and modifies the standard behaviours?
|
|
|
|
|
Yes. Just like what u mentioned. What I need to do is to create a popup menu literally looks like list control. The reason why I do so is because I found out that the list control icon attribute as following...
m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES | LVS_EX_FULLROWSELECT);
...where when I click on one of the item, I manage to select the whole row but not able to highlight the icon itself. If u have notice, when you put in the above code, there will be an empty white space reserved for the icon to be loaded. My original task is to eliminate that white space (in other words is to make it transparent).
For example, I'm trying to make the list control to be exactly same as the right click button in Adobe PDF reader where i can select whole row with icon (transparent background) and a tick (check mark).
By the way, the icons I obtained is from EnumWindowProc where I get from Window Application (same as ALT + TAB button)
Sincerely,
arthur89kim
|
|
|
|
|
Then what you want is a list control with a customized appearance.
For this, the best is to use a owner-draw list control with the owner-draw property set (i.e. created using the LVS_OWNERDRAWFIXED style); then process the WM_DRAWITEM to give your control the apeearance you want.
Look at these links for some samples:
|
|
|
|
|
Thanks for the reply. I'll look into it. I was hoping to find alternative way to solve it without using owner-draw or other drawing method. If that's the case, I shall study on it. Thanks again.
Sincerely,
arthur89kim
|
|
|
|
|
I'm not sure that I fully understand your question, but a popup menu is, by its nature, a transient item. It pops up, the user makes a selection, it disappears. If you want some sort of permanent list on display I think you may need to use a different control. Perhaps you could give some more detail on the problem you are trying to solve.
It's time for a new signature.
|
|
|
|
|
What I need to do is to create a popup menu literally looks like list control. The reason why I do so is because I found out that the list control icon attribute as following...
m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES | LVS_EX_FULLROWSELECT);
...where when I click on one of the item, I manage to select the whole row but not able to highlight the icon itself. If u have notice, when you put in the above code, there will be an empty white space reserved for the icon to be loaded. My original task is to eliminate that white space (in other words is to make it transparent).
For example, I'm trying to make the list control to be exactly same as the right click button in Adobe PDF reader where i can select whole row with icon (transparent background) and a tick (check mark).
By the way, the icons I obtained is from EnumWindowProc where I get from Window Application (same as ALT + TAB button).
Sincerely,
arthur89kim
|
|
|
|
|
I am still very confused about your requirements. If you have a popup menu then the selection rectangle will cover the entire width of the item you select; just right click on this page and move your mouse up and down the list.
It's time for a new signature.
|
|
|
|
|
Sorry for the confusion, I was given task to make a list control with icons (EnumWindowProc from windows' applications) and a tick (check mark) to indicate my item is selected when I double click on it.
However, the drawback of using list control occurs when I highlight the item before double clicking it. This is where my task given, I am suppose to make a full row highlight without white space (especially when there is an icon in the list). The white space is reserved for the icons inserted into it.
Hence, I was trying to use CMenu to obtain desirable results (exp: right click on PDF file to see the popup menu). Nevertheless, by using popup menu, I am not able to show the popup menu permanently as we can do with list control.
I hope my statements do clear up the confusion made. Thanks for your patient to help me out.
Sincerely,
arthur89kim
|
|
|
|
|
If you use a normal list control with the LVS_EX_FULLROWSELECT style then you will get the result you are asking for. Take a look at any Windows program (Windows Explorer for example) that has a list view and you will see what I mean.
It's time for a new signature.
|
|
|
|
|
Thanks for your reply. I have try it out but no different. There is still white space withing that icon area.
Sincerely,
arthur89kim
|
|
|
|
|
arthur89kim wrote: I have try it out but no different. There is still white space withing that icon area.
I am still not sure what it is you are trying to achieve and why white space is so important.
It's time for a new signature.
|
|
|
|
|
That is the task I'm given. To eliminate the white space in order to make it a full row highlight without white space. It would seems more professional that way.
By the way, thanks for your reply. I will try out the WM_DRAWITEM as mentioned by Sauro Viti.
Sincerely,
arthur89kim
|
|
|
|
|
With relative paths for output file the warning appear. I have found only one solution to have such patches in Microsoft.CppBuild.targets
<VCMessage Condition="'%(_OutputFileFromLib.FullPath)' != '$([System.IO.Path]::GetFullPath($(TargetPath)))'" Code="MSB8012" Type="Warning" Arguments="TargetPath;$(TargetPath);Library;%(_OutputFileFromLib.FullPath);Lib"/>
but they are already present
Чесноков
|
|
|
|
|
I am running 2 excel files on my system . there are 2 excel.exe(server) showing in the process tab of
taskmanager .when I called GetActiveObject() function I always get the pointer of same excel . never get of another excel file . how can I get the object of every excel server running in the process
Trioum
|
|
|
|
|
http://support.microsoft.com/kb/238975
Office applications typically registers their the first instance only in the ROT. but they are supposed to register their individual documents in the ROT, so iterating through the ROT using IRunningObjectTable Interface may be the option to get the instance you want, provided you know the document which is opened with that instance.
|
|
|
|
|
can you help me with some source code
Trioum
|
|
|
|
|
eventhough multple instances of excel are running, only the first instance would have an entry in ROT. But all the instances registers the documents opened in them in ROT. Its the key to bind to that instance of excel.
say, u have more than one instances of excel apps, and want to get the instance in which "MyExcel.xls" file is opened..
void GetMyExcelInstance()
{
CApplication oExcelApp;
CoInitialize(NULL);
HRESULT hr;
IBindCtx *piBindCtx = 0;
hr = CreateBindCtx( 0, &piBindCtx );
IRunningObjectTable *piROT = 0;
hr = piBindCtx->GetRunningObjectTable(&piROT);
IEnumMoniker *piEnum = 0;
hr = piROT->EnumRunning(&piEnum);
piEnum->Reset();
ULONG nFetched;
IMoniker *piMoniker = 0;
bool bGot = false;
while(piEnum->Next(1, &piMoniker, &nFetched) == S_OK && !bGot)
{
LPOLESTR strName;
hr = piMoniker->GetDisplayName(piBindCtx, NULL, &strName);
CString csName(strName);
CoTaskMemFree(strName);
if(csName.Find(L"MyExcel.xls") != -1)
{
IDispatch *piDispObj = 0;
hr = piMoniker->BindToObject(piBindCtx, NULL, IID_IDispatch, (void**)&piDispObj);
CWorkbook oWorkBook(piDispObj);
oExcelApp = oWorkBook.get_Application();
bGot = true;
}
piMoniker->Release();
}
piEnum->Release();
piROT->Release();
piBindCtx->Release();
if(bGot)
{
}
}
do proper error checking..
|
|
|
|
|
//code is ok up to here
CWorkbook oWorkBook(piDispObj); //class for excel workbook object
// but as I called the following line errro occurs member not found
oExcelApp = oWorkBook.get_Application();
Trioum
|
|
|
|
|
did you generate wrapper classs for excel type library? those class members may vary in different visual studio versions. check your class for WorkBook object to see how it returns
Application object. it may be by get_Application() or GetApplication() or by some other means...
|
|
|
|
|
Using reduction to estimate sum of array elements leads to results differences for more than 1 thread in parallel region
#pragma omp parallel for reduction (+: sum)
for (i = 0; i < N * N; i++) {
vec3[i] = vec1[i] * vec2[i];
sum += vec3[i];
}
The difference is:
sum = 101.759239;
sum = 101.764313;
Чесноков
|
|
|
|
|
Looks like you're using float (not double ) and suffering from loss of precision adding big and small numbers.
Simple example:
float sum1 = 0.0, sum2 = 1.0;
for (i = 0; i < 10000000; i++)
{
sum1 += 1e-8;
sum2 += 1e-8;
}
sum1 += 1.0;
In a quick test, I got sum1 = 1.092107... and sum2 = 1.0
However, replacing float with double , I get sum1 = 1.09999999998803 and sum2 = 1.09999999939225.
You can get almost any answer you want in float by choosing the order of evaluation.
Software rusts. Simon Stephenson, ca 1994.
|
|
|
|
|
yes, after I replaced with doubles results were equal
Чесноков
|
|
|
|
|
Dears
There are two audio output devices :
1. Bluetooth SCO Audio
2. Realtek HD Audio output
And if bluetooth headset connects to PC, the default output device is item 1.
I want to change to item 2. I have tried some methods, but it still unsuccess
I know MCI functions should done it, but I am not sure which functions should use..
Attachment is test code below:
#include <windows.h>
#pragma comment (lib, "winmm.lib")
#include <mmsystem.h>
#include <iostream>
#include <stdio.h>
int main()
{
int AIDChoise;
UINT nDevices = waveInGetNumDevs();
MCI_WAVE_SET_PARMS parms;
DWORD rc;
TCHAR ErrMsg[256];
WAVEINCAPS inwcps;
WAVEOUTCAPS outwcps;
for (int k=0; k < nDevices; k++)
{
waveInGetDevCaps(k,&inwcps,sizeof(inwcps));
printf(" In devname %d : %s \n",k,inwcps.szPname);
}
for (k=0; k < nDevices; k++)
{
waveOutGetDevCaps(k,&outwcps,sizeof(outwcps));
printf(" Out devname %d : %s \n\n",k,outwcps.szPname);
}
printf("Please select output device :");
scanf(" %d",&AIDChoise);
switch(AIDChoise)
{
case 0:
printf("0 ~~~~~~~~~");
parms.wOutput = 0;
rc = mciSendCommand(0, MCI_SET, MCI_WAVE_OUTPUT, (DWORD)&parms);
if ( rc != 0 )
printf("Error Msg : %s \n",mciGetErrorString(rc,ErrMsg,256));
break;
case 1:
printf("1 ~~~~~~~~~");
parms.wOutput = 1;
rc = mciSendCommand(1, MCI_SET, MCI_WAVE_OUTPUT, (DWORD)&parms);
if ( rc != 0 )
printf("Error Msg : %s \n",mciGetErrorString(rc,ErrMsg,256));
break;
default:
printf("2~~~~~~~~~");
printf("Invalid command.. \n");
break;
}
return 0;
}
|
|
|
|
|
yes, I found out...
use "waveOutMessage" function can change audio device..
|
|
|
|